signed和unsigned的运算分析
前几天碰到了一个例子很有意思,加深了对源码,反码,补码的认识,例子如下:
int main()
{
//signed时,char 最高位为符号为,其余为数据位
char x1 = 255; // 1111 1111(最高位为符号位)
char x2 = 256; // 1 0000 0000 (数据溢出的位数舍弃)
int x3 = x1 +x2;
printf("signed:%d\n",x3);
//unsigned时,8位二进制数都为数据位,最大值为255
unsigned char y1 = 255;
unsigned char y2 = 256;//1 0000 0000 舍弃超出的一位
unsigned int y3 = y1 + y2;
printf("unsigned:%d",y3);
}
输出结果:
分析其结果原因:
对于一个变量的二进制值的最高位为1的,
如果该变量的数据类型是有符号的(signed),则该二进制值必然都是一个补码值。
如果该变量的数据类型是无符号的(unsigned),则该二进制值必然都是一个原码值。
计算过程如下图: