1.这个题目涉及到整型提升和截断
#include<stdio.h> int main() { unsigned char a = 100; //00000000000000000000000011001000 //11001000 unsigned char b = 200; //00000000000000000000000001100100 //01100100-----b //11001000-----a //00000000000000000000000100101100 unsigned char c = 0; c = a + b; //00101100-------c-----44 printf("%d %d", a + b, c); return 0; }
a+b的打印结果是300,c的打印结果是44;
(1)分别用二进制表示100,200;
(2)因为100,200要放到无符号的字符类型里面去,而无符号的字符类型只能存放8个比特位,所以会发生截断现象;
(3)a+b时候,会发生整型提升,就是把其他的类型转换成int类型,因为a,b都是无符号的,所以就是高位全部补上0,也就是回到了截断前的二进制序列;
(4)执行加法,a+b就是对应位的数字相加,这样第九位就有了一个数字1;
(5)直接输出a+b,以%d的形式打印,就把这个序列当作有符号的,毫无疑问就是这个32比特位计算的值,也就是原来的100+200=300;
(6)放到c里面的话,就只能保留8个比特位(这样第9位的1就丢失了),打印的时候,需要进行整型提升,c是无符号的,只能高位补上0,高位时0则是正数,原码反码补码都一样,打印44;