按位非运算符返回意外和负值?

rul*_*lof 1 c c++ binary bit-manipulation

我正在尝试使用 Bitwise NOT 获取整数的值,但没有得到我期望的值。

#include <stdio.h>

int main(){
    int i = 16;
    int j = ~i;
    printf("%d", j);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

16 不应该是:

00000000000000000000000000010000
Run Code Online (Sandbox Code Playgroud)

所以 ~16 应该是:

11111111111111111111111111101111
Run Code Online (Sandbox Code Playgroud)

为什么我没有得到我期望的结果,为什么结果是负面的?

这就是我想要做的:

我有一个例如 27 的数字,它是:

00000000000000000000000000011011
Run Code Online (Sandbox Code Playgroud)

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

所以我需要得到这个值

11111111111111111111111111110111
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*ean 5

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

因此,如果您做了一些设置 an 的最高位int(有符号整数,而不是无符号整数)的操作,然后让工具/库向您显示那个值int,您将看到一个负数。

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

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

我会说,作为一般的经验法则,如果您要进行位操作,则使用unsigned ints 并以十六进制显示它们。那样生活会更简单,而且最符合意图。(花式加速数学技巧是一个明显的例外)