一.程序片段
int main()
{
char a = 200;
char b = 100;
char c = 0;
c = a + b;
printf(“%d %d”, a+b,c);
return 0;
}
运行结果:
300
44
二.解释溢出
char分配的是一字节有符号整数,范围通常是 -128 到 127。
如果char类型被赋值一个超出范围的数值300,char类型的储存就会发生溢出,根据有符号整数的溢出规则,当赋给有符号类型的变量一个超过其表示范围的值时,结果是未定义的。而溢出的数据储存有一定规则转化为范围内的数据
三.转化规则
1.300储存在char类型时,我们可以先得到300的补码:
1 0010 1100
因为char只能存储8bit,会舍弃第九位数字,得到补码
0010 1100
整数的补码,反码,原码相同,所以就直接转化为44
2. 428储存在char类型时,先得到428的补码
1 1010 1100
舍弃超出8bit的字符:
1010 1100
整形提升,用符号位填充(32位)
1111 1111 1111 1111 1111 1111 1010 1100
首位元素会被当做符号位,1首元素会被当做负值,补码取反后+1,得到原码
1000 0000 0000 0000 0000 0101 0100
则得到-84