如果我使用的是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;
}
答案 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都按预期工作!