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;