需要对按位非 (~) 运算符进行说明

标签 c binary logic bitwise-operators

假设您有以下 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/

相关文章:

Python从索引处开始循环遍历列表

math - 不知道能不能用Prolog做解析推理

c - 列表中的学生 ID 未打印出来

Android xamarin visual studio 错误 : 'System.Configuration.dll'

c++ - 二进制数据 : write an entire object into a file or separated variables (no object)? 哪个性能更好

c++ - 制作索引创建类

c++ - 使用最少的内部内存资源有效地对进出磁盘的字符串进行排序的算法

c - 如何安装 DJGPP

encoding - BCD格式在编程中如何使用?

java - For 循环未正确执行 scan.nextInt