左图无符号unsigned char的数值图,可知,是由0~255。
右图是有符号char(char和 signed cahr)的数值图,可知是由 -128~127。
右图的1000 0001为-127 是因为1000 0001是有符号char的补码,其转换原码(-1成为反码,符号位不变取反成为原码)为1111 1111 第一个1为符号位代表为负数 后面7个1为127 所以值为-127
而1000 0000 为-128 这是规定 记住就行
截断:
将一个整数存储到char里面,由于char是一个字节大小,对于四个字节大小的整数,会发生截断,只保留补码的最后8位。
整形提升:
意义在于将截断后的8位补充到32位,
规则(如何提升):对char和signed char(有符号char)这种有符号位的采用左补24个符号位(根据截断后的8个比特位的符号位来作为左补,如截断后的符号位为1,则左补24个1 反之补0)。
对unsigned char 这种无符号位的采用直接左补24个0。
整形提升后的打印;
一:%u
%u是以无符号的形式打印整数,所以,我们整形提升后得到的32位补码直接可以作为原码 ,再打印出结果。
二:%d
%d是以有符号的形式打印整数,所以,我们整形提升后得到的32位补码,要先观察32的第一位,如果是1,则是负数,需要将这32位补码转化为原码(-1得到反码,再符号位不变按位取反得到原码);如果是0,则是正数,原返补码相同,直接打印即可。
重点:整形提升需要注意char是否有无符号,但是提升完毕后,不管是%d,还是%u打印,都不需要在考虑char是否有无符号,而是要站在%d和%u的角度去考虑整形提升后的32位是直接打印(%u),还是要从补码换成原码(%d)。
题目讲解:
