c++ - 按位 NOT 运算符返回意外的负值?

标签 c++ c binary bit-manipulation

<分区>

我正在尝试使用按位非运算来获取整数的值,但我没有得到预期的值。

#include <stdio.h>

int main(){
    int i = 16;
    int j = ~i;
    printf("%d", j);
    return 0;
}

16 不应该是:

00000000000000000000000000010000

所以 ~16 应该是:

11111111111111111111111111101111

为什么我没有得到预期的结果以及结果是否定的?

这就是我想要做的:

我有一个例子 27 的数字是:

00000000000000000000000000011011

并且想要检查每一位是 1 还是 0。

所以我需要得到例如这个值

11111111111111111111111111110111

使用第二个检查第一个的第 3 位是否设置为 1。

最佳答案

尽管可以对编译器行为提出迂腐的观点,但简单的答案是设置最高位的 signed int 是一个负数。

所以如果你做了一些设置 int 的最高位的事情(一个有符号的 int,而不是一个无符号的),那么请工具/库向你显示那个 的值int,你会看到一个负数。

这不是普遍真理,但对于大多数现代系统来说,这是一个很好的近似值。

请注意,它是 printf 在这里进行表示 - 因为 %d 将数字格式化为带符号的。 %u 可能会给出您期望的结果。仅更改变量的类型是不够的,因为 printf 对其参数的类型一无所知。

我想说的是,作为一般的经验法则,如果您正在进行位操作,则使用 unsigned int 并以十六进制显示它们。这样生活会更简单,而且最符合意图。 (花哨的加速数学技巧是一个明显的异常(exception))

关于c++ - 按位 NOT 运算符返回意外的负值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20728828/

相关文章:

c++ - 在 v8 中将字符串转换为函数

c - 与 C 中的函数 strtok() 作斗争

c - 这是与按钮/操纵杆交互的正确方式吗?

c - 向 C 二进制文件添加 ASCII 注释?

swift - 我很困惑... 8、16、32 和 64 位格式到底是什么?

Haskell IO 递归(带二叉树)

c++ - Google Kickstart 2018,测试用例中的圆形错误

c++ - Vector Add的STL算法

c++ - 在 C++ 中实现通用 vector 类

c - 将文件 .txt 读取到数组并拆分