按位非(〜)运算符需要澄清

Jam*_*sev 4 c binary logic bitwise-operators

假设您有以下C代码.

 unsigned char a = 1;

 printf("%d\n", ~a); // prints -2
 printf("%d\n", a); // prints 1
Run Code Online (Sandbox Code Playgroud)

我很惊讶看到~1转换后打印出-2:

与0000 0001相反的是1111 1110.这不是-2.

我在这里错过了什么?

ken*_*ytm 10

这是两个补充.

在二进制补码表示中,如果数字x的最高有效位为1,则实际值为 - (~x + 1).

例如,

0b11110000 = -(~0b1111 + 1) = -(15 + 1) = -16.
Run Code Online (Sandbox Code Playgroud)

这是负数的自然表示,因为

0000001 =  1
0000000 =  0
1111111 = -1  (wrap around)
1111110 = -2
1111101 = -3 etc.
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参见http://en.wikipedia.org/wiki/Two%27s_complement.


顺便说一句,要打印无符号值,请使用%hhu%hhx格式化.请访问http://www.ideone.com/YafE3.