什么是整型提升?
整型提升是较小的整数类型(如char
、short
)会被自动转换成较大的整数类型,通常是int
或unsigned int
(取决于具体情况和原始类型的大小)。
1.无符号数
以32位平台为例:
该程序定义了一个无符号char类型的变量a,我们知道,数值在计算机中是以补码形式存储的,所以我们首先要看出a的补码
原码反码补码转换规则是:正数的原码反码补码相同,负数的反码等于原码除了符号位之外的各位取反,补码等于反码加1。
-128的原码:10000000,00000000,00000000,10000000
-128的反码:11111111,11111111,11111111,01111111
-128的补码:11111111,11111111,11111111,10000000
而a是unsigned char类型,它只有一个字节大小,所以只能容纳-128的低8位,此时a里面装的是10000000。
而打印a时,%u表示我要打印的是一个无符号数,而一个字节大小的a怎么表示四个字节大小的无符号数呢,于是就有了整型提升。
a的10000000仍放在最后一个字节,无符号数的高位补0,前面三个字节皆为0,
于是要打印的变成了00000000,00000000,00000000,10000000为128
2.有符号数
有符号数会稍微复杂一些,但也就是正数高位补0,负数高位补1 。
同样是32位平台
该程序定义了一个有符号char类型的变量a
步骤同上:
-128的原码:10000000,00000000,00000000,10000000
-128的反码:11111111,11111111,11111111,01111111
-128的补码:11111111,11111111,11111111,10000000
a内容二进制表示是10000000,其中1是a的符号位,而打印a进行整型提升时,由于a的符号位是1,所以系统自动将提升后的符号位及高位补充1,也就变成了这样:11111111,11111111,11111111,10000000。%u将其当做无符号数打印,结果是:
a赋的值是128的话和上述结果也是相同的,大家可以去验证。
小小的变动一下:
猜测一下打印的结果是什么?
先看-129的补码:11111111,11111111,11111111,01111111
0成为a的符号位,打印进行整型提升时,高位和符号位要补0,即00000000,00000000,00000000,01111111
结果如下:
另外需要注意的是,我这里打印输出使用的是%u,如果使用的是%d,需要注意输出时计算机将补码转换成原码的过程。