%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
%x
是printf
格式 ,表示int
值应以hex显示。
~
是按位NOT ,它翻转整数中的所有位。
该声明:
printf("%x", m);
将输出20
显示为0x20
=十进制32
。
该声明:
printf("%x", ~m);
将显示输出ffdf
因为0xffdf
是0x20
的按位反转。
可视化二进制中的按位否定可能更有意义:
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)打印其值。 如果值在可表示为int
或unsigned 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
和分号。)