%x和〜的重要性

int m=32 printf("%x" , ~m); 

这个语句的输出是ffdf而没有~ output是20%x~的意义是什么?

~运算符是按位否定。 它会打印出m值的按位否定。 %x表示printf将以hex格式输出其值。

因此,值0xffdf是值0x20 (32)的否定。

值32(int位将是):

 0000 0000 0010 0000 

它的按位否定将是:

 1111 1111 1101 1111 

这是有道理的:

 1111 1111 = 0xff 

和:

 1101 1111 = 0xdf 

%xprintf格式 ,表示int值应以hex显示。

~是按位NOT ,它翻转整数中的所有位。

该声明:

 printf("%x", m); 

将输出20显示为0x20 =十进制32

该声明:

 printf("%x", ~m); 

将显示输出ffdf因为0xffdf0x20的按位反转。

可视化二进制中的按位否定可能更有意义:

 Base 10: 32 65503 Base 16: 0x20 0xFFDF Base 2: 0000000000100000 1111111111011111 

~符号表示按位NOT补码运算符 ; 一元运算,对每个位执行逻辑否定 ,形成给定二进制值的补码。 0的二进制数字变为1,1的二进制数字变为0。

32是二进制的00100000,二进制的32是11011111(或十进制的223)。

printf函数中的%x选项将显示无符号hex格式(使用小写字母)。

所以,

 printf("%x", m); // displays the hexadecimal value of 32 (00100000), "20" printf("%x", ~m); // displays the hexadecimal value of ~32 (11101111), "ffdf" 

[源]
http://en.wikipedia.org/wiki/Bitwise_operation#NOT
http://en.wikipedia.org/wiki/Hexadecimal
http://en.wikipedia.org/wiki/Printf_format_string

%x表示您在hex中打印x的值。

~32 = -33使用unsigned int来获得结果

这意味着x应该已经声明为unsigned而不是int

"%x" printf格式需要unsigned int参数,并以hex(base 16)打印其值。 如果值在可表示为intunsigned int (即0 .. INT_MAX )的范围内, 可以安全地将其与int参数一起使用。 使用带有负int值的"%x" ,正如此代码片段所做的那样,严格来说具有未定义的行为,尽管实际行为可能是合理一致的。

C标准说:

运算符的结果是其(提升的)操作数的按位补码(也就是说,当且仅当未设置转换的操作数中的相应位时,才设置结果中的每个位)。

请注意,它是根据操作数的表示而不是其值来定义的。

您描述的输出表明您正在使用具有二进制补码有符号整数的系统,其中int仅为16位,这在当前是不常见的。 (您使用的是古老的Turbo C编译器还是类似的东西?)在我的系统上,这个程序:

 #include  int main(void) { int m = 32; printf("%x\n" , ~m); return 0; } 

产生这个输出:

 ffffffdf 

(注意我在m的声明中添加了所需的#include 和分号。)