***************************************************
更多精彩,欢迎进入:http://shop115376623.taobao.com
***************************************************
代码如下:
“//”后为调试中的结果
unsigned int a = 6; //a = 6 【补码:0000 0000 0000 0000 0000 0000 0000 0110】
int b = -20; //b = -20 【补码:1111 1111 1111 1111 1111 1111 1110 1100】unsigned int c = a + b; //c = 4294967282 【补码:1111 1111 1111 1111 1111 1111 1111 0010】
int d = a + b; //d = -14
【int d = a + b; //d = -14:由 《补码:1111 1111 1111 1111 1111 1111 1111 0010》减去1,再取反得到14,保留最高位符号位】
if (a+b>6){
printf(">6\n"); //进入此判断,即a+b = c,而非d;
}
else
{
printf("<=6\n");
}
分析:
机器在数据都是由二进制补码表示的
正数的补码就是其本身
负数的补码是符号位不变各位取反再加一
8位机的话:
int a -1; 在机器中1111 1111
unsigned int b 1; 在机器中0000 0001
如果 a+b
a就转化为unsigned int 但里面的数值是不变的 1111 1111 把他转化成十进制2^8-1 + b