int m=32
printf("%x" , ~m);
此语句的输出为ffdf
,而~
输出不为20
。
%x
和~
的重要性是什么?
答案 0 :(得分:21)
~
运算符是按位否定。它会打印m
值的按位否定。 %x
表示printf
将以十六进制格式输出其值。
因此,值0xffdf
是值0x20
的否定(32)。
值32(int位是):
0000 0000 0010 0000
它的按位否定将是:
1111 1111 1101 1111
这是有道理的:
1111 1111 = 0xff
和
1101 1111 = 0xdf
答案 1 :(得分:6)
%x
是printf
format,表示int
值应以十六进制显示。
~
是bitwise 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
答案 2 :(得分:2)
~
符号代表按位NOT 或补充运算符; 一元运算,对每个位执行逻辑否定,形成给定二进制值的补码。 0的二进制数字变为1,1的二进制数字变为0。
32是二进制的00100000,而32是二进制的11011111(或十进制的223)。
%x
函数中的printf
选项将显示无符号十六进制格式(使用小写字母)。
所以,
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
答案 3 :(得分:1)
%x表示您以十六进制格式打印x的值。
答案 4 :(得分:1)
~32 = -33使用unsigned int来获得结果
答案 5 :(得分:1)
这意味着x
可能已经宣布为unsigned
而不是int
。
"%x"
printf格式需要unsigned int
参数,并以十六进制(基数16)打印其值。您可以安全地将它与int
参数一起使用,如果该值在可表示的范围内,可以是int
,也可以是unsigned int
(即0 .. INT_MAX
)。正如此代码片段所使用的"%x"
具有负int
值,严格来说具有未定义的行为,但实际行为可能是合理一致的。
C标准说:
〜运算符的结果是它的按位补码 (提升)操作数(也就是说,结果中的每个位都是设置的 如果未设置转换后的操作数中的相应位。)
请注意,它是根据操作数的表示定义的,而不是其值。
您描述的输出表明您正在使用具有二进制补码有符号整数的系统,其中int
仅为16位,这些日子不常见。 (您使用的是古老的Turbo C编译器还是类似的东西?)在我的系统上,这个程序:
#include <stdio.h>
int main(void) {
int m = 32;
printf("%x\n" , ~m);
return 0;
}
生成此输出:
ffffffdf
(请注意,我已在#include <stdio.h>
的声明中添加了必需的m
和分号。)