整型提升:指将字符类型和短整型转化成普通整型。分为有符号和无符号两种,有符号的情况下,已补码的最高位此进行补位,例如最高位为1,这用1进行补位,补至int类型的32bit。若最高位为0,则用0进行补位。无符号数则在前面直接进行补位。
例题:
将125赋值到中,125的二进制是00000000 00000000 00000000 01111101,将其赋值到char类型的a中时,要发生截断。因为char类型只占用一个字节,故a的值为 01111101。同理,10的二进制为00000000 00000000 00000000 00001010,b的值为00001010。
当a和b相加的时候,要进行整型提升。
a为01111101,最高位为0,则用0进行补位,为00000000 00000000 00000000 01111101
b为00001010,最高位为0,也用0进行补位,为00000000 00000000 00000000 00001010
a和b二进制相加为 00000000 00000000 00000000 10000111
将a加b值赋值到c里,c为char类型,所以要发生截断,c为 10000111。
打印时,打印的是整型c,所以c要再次进行整型提升。又因为char可代表有符号字符,所以要根据最高位的数字进行补位。
c的二进制的最高位为1,所以用1进行补位为 11111111 11111111 11111111 10000111,补位后得到的为整型的补码,将补码转变为源码,为 10000000 00000000 00000000 01111001.最高位为符号位1代表为负数,故将二进制转换成十进制为-121。
故第一个printf输出-121。printf("%d\n", a + b)。
a与b整型提升后为相加得到的二进制 00000000 00000000 00000000 10000111,打印的就为int整型的形式。将二进制转化为十进制后为135。
故第二个printf打印出的为135。
插入一个小知识点(源码,反码,补码的转换)
在内存中储存的是一个数的补码。对于正数而言,源码,反码,补码的只是一样的。而对于负数而言:源码除最高位的符号位取反等于反码,反码+1等于补码,补码变为源码时,可直接取反(除符号位不变)加一。
如:‘-1’
源码:10000000 00000000 00000000 00000001 ---- 进行( 除符号位不变)取反,得到
反码:11111111 11111111 11111111 11111110 ---- 进行 +1,得到
补码:11111111 11111111 11111111 11111111 ---- 进行取反(除符号位不变)加一
源码: 10000000 00000000 00000000 00000001