我有一个简单的应用程序:
#include <stdio.h>
int main(int argc, char **argv)
{
unsigned int a = 0x2; //= 10b
unsigned int b = ~a; // should be 01b
printf("%04x : %04x\n", a, b);
}
我想知道,为什么打印0002 : fffffffd
而不是0002 : 0001
?
答案 0 :(得分:4)
fffffffd(hex) -> 11111111111111111111111111111101(binary)
00000002(hex) -> 00000000000000000000000000000010(binary)
正如你所看到的,他们是彼此的逐渐否定。
答案 1 :(得分:1)
02x
是一个整数常量。在与0x00000002
对应的32位系统上,仅省略了无效的零。当您反转该值时,您将返回0xfffffffd
- 正好是您看到的值。
如果您只想保留最后两位,请使用0x03
进行掩码,如下所示:
unsigned int b = ~a & 0x03; // will be 01b
答案 2 :(得分:1)
基本上,你是对的。但是,无符号整数(通常)是32位长(在32位系统上)。
所以你不仅要翻过最后两位,还要翻过30位。
要解决这个问题,您只需要屏蔽您感兴趣的位:
#include <stdio.h>
int main(int argc, char **argv)
{
unsigned int a = 0x2; //= 10b
unsigned int b = ~a & 0x3; //= 01b (0x3 = 11b)
printf("%04x : %04x\n", a, b);
}
答案 3 :(得分:0)
这是因为2
以二进制o(在32位机器上)表示为
00000000000000000000000000000010
及其按位NOT是
11111111111111111111111111111101
相当于十六进制中的fffffffd
。