2011-09-01 71 views
3

你们可以请解释一下下面的程序按位补运算符

int main() 
{ 
int max = ~0; 
printf("%d\n",max);  
return 0; 
} 

AFAIK〜会翻转位。在这种情况下,即〜0将把所有位设置为1.所以max变量应该包含MAX值,但是我将o/p设置为-1。所以任何人都可以在这里告诉我为什么我得到o/p为-1。

回答

6

你为什么期望获得“最大值”?在2的补码有符号表示中,全1位模式代表-1。这只是它的方式。

以2的补码有符号表示的最大值由01111...1位模式表示(即第一位是0)。你得到的是1111...1,由于第一位符号位是1,所以显然是负数。

如果你想去的地方补零产生“最大值”的一个例子,使用无符号表示

int main() { 
    unsigned max = ~0u; 
    printf("%u\n", max);  
} 
+0

注意,变量/表达的两种类型**和**格式指示符('%u')必须同意为这也工作。如果他们不匹配,你有未定义的行为。 –

1

这是正确的输出,因为您使用的是签署了int数据类型。你需要阅读有关二的补码否定表达。所有一位不是最大负值,它是程序输出时的-1。最大负数有符号值是最重要的位设置,所有其余的位为零,在32位情况下为0x80000000。在32位情况下,最大正符号值为0x7fffffff。

1

以上答案已经涵盖了值为-1的~0背后的原因。

如果你正在寻找的最大整数值,那么你可以包括limits.h中库,并使用该库

INT_MAX给你最大的带符号整型值声明的常量。 UINT_MAX为您提供了最大的无符号整数值。

#include <stdio.h> 
#include <limits.h> 

int main() 
{ 
printf("Max signed int value: %d \n", INT_MAX); 
printf("Max unsigned int value: %u \n", UINT_MAX); 
return 0; 
} 
0

这个问题是很久以前的事,但对后人的缘故:
它可以帮助你看到它更好,如果你打印〜0既是int和十六进制如下:

printf("compliment of zero %d\n", (~0)); 
printf("compliment of zero 0x%x\n", (~0)); 

输出:
称赞的零 -1
称赞的 零的0xffffffff