例题1.
int main()
{
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = 0;
c = a + b;
printf("%d %d", a + b, c);
return 0;
}
问打印的两个数据是多少?
答:这道题主要是让我对于整型提升和截断有了更深刻的认识。首先是char类型的存储值的范围为-128~127,unsigned char存储范围是从0~255。
200的二进制表示是000000000000000000000000011001000,
100的二进制表示是000000000000000000000000001100100,
整型在存储进无符号的char类型中会发生截断在a中的存储变为11001000
整型在存储进无符号的char类型中会发生截断在a中的存储变为01100100
在a+b时会发生整型提升就是二者整型类型对应的二进制相加000000000000000000000000100101100,因此a+b在打印时会打印对应的整型数据对应的十进制数为300,a+b的整型数据存储到无符号char类型c中时会发生截断存储的是00101100,此时%d打印c会再次发生整型提升,因为是无符号所以高位全部补0,这是打印出的二进制是44。
故答案a+b打印300,c打印为44。