%x和〜的重要性

时间:2012-01-17 19:32:35

标签: c printf

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

此语句的输出为ffdf,而~输出不为20%x~的重要性是什么?

6 个答案:

答案 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)

%xprintf format,表示int值应以十六进制显示。

~bitwise NOT,它会翻转整数中的所有位。

声明:

printf("%x", m);

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

声明:

printf("%x", ~m);

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

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

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和分号。)