使用十六进制格式说明符打印Bitwise NOT运算符

时间:2015-06-30 17:50:34

标签: c

如果我使用的是m而不是~m,则代码会向我提供预期的十六进制值32,但此处它会将ffffffdf作为输出。

修改 我知道按位~ NOT运算符是如何工作的。但我不明白这一点。有人可以解释一下...... ??

#include<stdio.h>

int main()
{
    unsigned int m = 32;
    printf("%x\n", ~m); //ffffffdf is printed as output

    return 0;
}

2 个答案:

答案 0 :(得分:3)

每个十六进制数字是四位。由于你有8个十六进制数字,你的整数似乎是8 * 4 = 32位。

32 = 000000000000000000000000000010000的NOT将类似于11111111111111111111111111101111,它将是上面的十六进制数字。

答案 1 :(得分:2)

在C中,〜是按位运算符。您说您了解此运算符的工作原理,但您的问题表明您没有。所以让我们来看看这个例子:

首先,声明m是一个unsigned int,在你的平台上恰好是32位宽。您为其分配十进制值32.变量m是0x00000020。

然后,你打印出来。正常打印时,会出现预期的输出。但是当你用〜操作符打印出来时,你会得到完全不同的东西。

〜(按位非)运算符与它在锡上所说的完全相同:它否定(翻转)每个位,因此1变为0,0变为1。我们来看看这会对您的号码产生什么影响:

 m = 0b00000000000000000000000000100000 = 0x00000020
~m = 0b11111111111111111111111111011111 = 0xffffffdf

正如您所看到的,结果与正在输出的内容完全匹配,这很好 - 这意味着您的编译器和CPU都按预期工作!