对于计算机中补码的运算(无符号类型)
int main()
{
unsigned char i = 7;
int j = 0;
for (; i > 0; i -= 3)
{
++j;
}
printf("%d", j);
return 0;
}
对于这段代码大家可能觉得答案为 3
但是不是的
大家可能会忽略,i是一个无符号整型
计算机中的运算是以补码形式运算的,
所以输出结果为173
第一步: 7进来,j=1
i-3=4,j=2
i-3=1,j=3
接下得到i=-2,但是不要忘了i不能等于负数2
-2 :
原码1000 0000 0000 0000 0000 0000 0000 0010
反码1111 1111 1111 1111 1111 1111 1111 1101
补码1111 1111 1111 1111 1111 1111 1111 1110
char只占一个字节所以取2后八位1111 1110
所以此时-2在计算机中表示的是254
254里面有84个3,余下了2,2-3又得到-1(255)
此时已经等于3+84=87
-1:
原码 1000 0000 0000 0000 0000 0000 0000 0001
反码 1111 1111 1111 1111 1111 1111 1111 1110
补码 1111 1111 1111 1111 1111 1111 1111 1111
无符号char 1111 1111 255
255里面有85个3;
254 251 248 245 242 239 .......2..255(-1)....0
所以就得到输出结果3+84+1(2到-1)+85=173


查看30道真题和解析