假设您有以下 C 代码。
unsigned char a = 1;
printf("%d\n", ~a); // prints -2
printf("%d\n", a); // prints 1
我很惊讶地看到 -2 作为 ~1 转换的结果打印出来:
0000 0001 的相反数是 1111 1110。那不是 -2。
我在这里错过了什么?
最佳答案
它是二进制补码。
在二进制补码表示中,如果数字 x 的最高有效位为 1,则实际值为 −(~x + 1)。
例如,
0b11110000 = -(~0b1111 + 1) = -(15 + 1) = -16.
这是负数的自然表示,因为
0000001 = 1
0000000 = 0
1111111 = -1 (wrap around)
1111110 = -2
1111101 = -3 etc.
参见 http://en.wikipedia.org/wiki/Two%27s_complement了解详情。
顺便说一句,要打印无符号值,请使用 %hhu
或 %hhx
格式。参见 http://www.ideone.com/YafE3 .
关于需要对按位非 (~) 运算符进行说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3695962/