C/C++类型转换(一)

对于C/C++来说,基本上所有的内容都可以从内存说起,所以还是接着说C/C++内存的事,这里主要介绍一下在C/C++中使用比较多的类型转换,其实主要是C,因为C++中引入了更安全的四种强制类型转换方式,下一篇介绍。
如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢
C/C++中的类型转换主要分为:隐式类型转换 & 显示类型转换(即强制类型转换)

隐式类型转换

在C Primer Plus中对隐式类型转换介绍了一下几大规则:

  1. 在表达式中,unsigned和signed的char和short都会被系统自动转成int,当short和int内存大小相同时(比如16 bit操作系统)unsigned short会被转成unsigned int(因为这个时候unsigned short比int大)
  2. 包含两种数据类型的任意运算中,两个值会被分别转成两种类型中的高级别的数据类型
  3. 类型的级别从低到高:long double > double > float > unsigned long long > long long > unsigned long > long > unsigned int > int,有一个特殊情况,当long和int的大小相同时,unsigned int比long级别高,还有就是short和char类型没有出现是因为它们已经被OS转成了int或unsigned int
    例如:混合运算转换过程 3+4/5.0F+6-9.0,先计算4/5.0F,4转成float参与运算得到0.8F,3+0.8F,3转成float参与运算得到3.8F,3.8F+6得到9.8F,9.8F-9.0因为浮点数默认是double型,9.8F被转成double型9.8参与运算得到double型0.8,可以看出混合运算转换过程是一步一步进行的
  4. 在赋值语句中,会被转换成赋值运算符左侧的类型,可能升级,也可能降级,不考虑四舍五入
  5. 作为函数参数时,char和short会被自动转换成int,float会被转成double
注意

隐式数据类型转换是OS在上述5种情况下自发进行的,对coding者来说是透明的,这里我没有继续深究,不再过多介绍,有些编译器可能在非上述情况下也进行了自动数据类型转换,那不是隐式数据类型转换,是编译器提供的便利,隐式数据类型转换只涉及基本的数据类型,指针不进行隐式数据类型转换

显示类型转换(即强制类型转换)

形式是 (type)data; 即小括号后面的数据被转成小括号内的数据类型

  1. 强转基本数据类型,12 + 12.2; 如果不进行强制类型转换,系统将自动进行隐式数据类型转换,转成两个数据类型中较高(占内存较大)的数据类型,也就是double,这样也以最大限度的保证计算的精度,也可以进行强转,例如12 + (int)12.2; 会把12.2先转成整型12,然后再进行加法操作
  2. 强转指针类型/强转地址类型,进行指针/地址类型的转换,需要注意两点,一是指针的类型,决定了指针的读写方式(也就是一次可以操作多少字节的数据),另一点是一定不要越界访问
	int a = 12;
	double *p = (double *)&a;
	*p = 12.3;

这样的操作是非法的,int a; 只有 4Byte,double *p 一次可以操作 8Byte,明显是越界操作了

	int a = 12;
	float *p = (float *)&a;
	*p = 23.2;

这样的操作是合法的(int和float都占 4Byte),但因为float和int在内存中的存储方式不同(我之前的博客有过介绍),所以输出的数据可能与想象中的结果不同,但这是合法的操作

	double d = 12.3;
	int *p = (int *)&d;
	*p = 34;                       // 操作前 4Byte
	*(p + 1) = 45;                 // 操作后 4Byte
	*(int *)((short*)p + 1) = 56;  // 操作中间 4Byte

可以看出指针的操作是很灵活的,但是一定注意不要越界进行读写操作

以上测试均是在win10 vs2017 64bit编译器下进行的

这篇就介绍这么多,下一篇介绍一下C++中引入的更安全的四种强制类型转换方式C/C++类型转换(二)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值