2012-01-17 56 views
8
int m=32 
printf("%x" , ~m); 

输出为ffdf,没有~输出为20%x~是什么意思?意义及本声明〜

+6

你可能想通过你的一些老问题,接受最好的答案,否则人家可能不想提供有用的答案。 – brc 2012-01-17 19:34:56

回答

19

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

所以,值0xffdf是值0x20(32)的否定。

值32(INT位会):

0000 0000 0010 0000 

其按位取反将是:

1111 1111 1101 1111 

这是有道理的,因为:

1111 1111 = 0xff 

和:

1101 1111 = 0xdf 
+1

非常感谢你的回答。 – 2012-01-17 19:43:53

1

而%x表示您在十六进制中打印x的值。

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 
1

〜32 = -33使用unsigned int类型,得到的结果

+1

要获得*什么*结果? – 2012-01-17 20:01:12

+0

很好的细节 – Omar 2012-01-17 20:09:12

+1

4294967263肯定 – 2012-01-17 20:09:57

1

这意味着x应该有可能已经被宣布unsigned而不是int

"%x" printf格式需要参数unsigned int,并以十六进制(基数16)打印其值。如果的值在可表示为intunsigned int(即,0 .. INT_MAX)的范围内,您可以安全地使用它int参数。使用"%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声明分号。)

2

~符号代表位NOT,或补运算符; 是对每个位执行逻辑否定的一元操作,形成给定二进制值的“补码”。 0的二进制数字变为1,1的变为0.

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

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

所以,

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