隐式类型转换(整型提升)概念
C语言是一种强类型语言,当使用一种类型的对象代替另外一种类型的对象进行操作时,必须首先进行类型转换。 隐式类型转换由编译器自动进行,不需要程序员干预。
说得通俗一点就是
定义的类型和输出的类型不一致,比如定义一个char型变量却用%d类型来输出
整型提升概念
这是来自比特上课截的图
整型提升的规则
整型提升是按照变量的数据类型的符号来提升的
正数的整型提升
char ch1 = 1;
变量ch1的二进制位(补码)中只有8个比特位
本来是00000000000000000000000000000001
然后截断后就变成了00000001(后8bit)
因为char为有符号的char(后面的文章会讲到)
所以整型提升时,就高位补充符号位,即为0
所以变成
00000000000000000000000000000001(假设以int类型输出)
举例:
如图所示
10的原码反码和补码是一样的,所以10的补码就是
00000000000000000000000000001010
但是ch1是char型,所以在内存中储存的是00001010(只要后八位)
随后ch1要整型输出,而符号位是0,所以整型提升后的补码为
00000000000000000000000000001010
负数的整型提升
char ch2 = -1;
-1的补码是11111111111111111111111111111111
变量ch2的二进制位(补码)只有8bit
所以截断后就是11111111
有因为char是有符号的char,
所以在整型提升的时候,高位补充符号位,即为1
提升之后的结果就为
11111111111111111111111111111111
可能这样看不出不用符合的类型输出会有什么差异,这用几个稍微难一点的例子来说明
unsigned char ch3 = -1;//表示的是无符号类型的char
-1的补码同样是11111111111111111111111111111111
所以截断后就是11111111
但是char是无符号的char
所以符号位程序认为是0,高位补充符号位,即为0
所以提升后的结果就是
00000000000000000000000011111111
如果以%d形式输出的话,答案就是255
总结
用好相应的类型输出是很重要的,不要以为用不一样的类型输出结果就会是一样,那种几率是很小的
至于文中补码,反码,原码的转化以及无符号有符号的差异将会后续写文章说明