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.