按位补码运算符

时间:2011-09-01 18:28:06

标签: c bitwise-operators

你们可以解释下面的程序

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

AFAIK~将翻转位。在这种情况下,即〜0会将所有位设置为1.因此,最大变量应包含MAX值,但我将o / p设为-1。那么这里的任何人都可以告诉我为什么我的o / p为-1。

4 个答案:

答案 0 :(得分:6)

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

二进制补码有符号表示中的最大值由01111...1位模式表示(即第一位为0)。你得到的是1111...1,这显然是负的,因为第一位 - 符号位是1

如果您想要一个补码零产生“最大值”的示例,请使用 unsigned 表示

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

答案 1 :(得分:1)

这是正确的输出,因为您使用的是已签名的int数据类型。你需要阅读两个补码负面表示。所有一位都不是最大负值,程序输出时为-1。最大负有符号值是最高有效位设置,所有剩余位为零,在32位情况下为0x80000000。在32位情况下,最大正有符号值为0x7fffffff。

答案 2 :(得分:1)

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

如果要查找最大整数值,则可以包含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;
}

答案 3 :(得分:0)

这个问题很久以前,但为了后人的缘故:
如果你按照以下方式打印〜0作为int和hex,它可能会帮助你更好地看到它:

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

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