为什么unsigned int x = -1和int y = ~0具有相同的二进制表示?

在以下代码段中将是:

  • function的结果
  • x的值
  • y的价值
     {
          unsigned int x = -1;
          int y;
          y = ~0;
          if(x == y)
             的printf( “同”);
         其他
              printf(“不一样”);
      }
一个。 同样,MAXINT,-1
湾 不一样,MAXINT,-MAXINT
 C。 同样,MAXUINT,-1
 d。 同样,MAXUINT,MAXUINT
即 不一样,MAXINT,MAXUINT

有人可以解释我的工作原理或只是解释一下片段吗?

我知道它是关于两个补码n等.MAXINT和-1的意义是什么? 这是因为unsigned int和int的事情 – 我是对的吗?

如果你运行这个程序,你会发现答案是错的 ,c是正确的答案:

#include  #include  int main() { unsigned int x=-1; int y; y = ~0; if(x == y) printf("same\n"); if(x==INT_MAX) printf("INT_MAX\n"); if(x==UINT_MAX) printf("UINT_MAX\n"); else printf("not same"); return 0; } 

unsigned int x=-1;

1是整数文字,类型为int (因为它适合int )。 一元-应用于int不会导致进一步提升,因此-1是值为-1int

当转换为unsigned int modulo时,使用2 ^ N算术,其中N是unsigned int的值位数。 x的值为2 ^ N – 1,即UINT_MAX (什么是MAX_UNIT ?)。

 int y; y = ~0; 

同样0int类型,在C中所有允许的int表示必须具有一个int所有值位,表示0为0.再次没有促进一元促进~所以~0是一个int ,所有值位为1.它是什么value是依赖于实现的,但它是负的(符号位将被设置),所以绝对不是UINT_MAXINT_MAX 。 该值存储在y不变。

 if(x == y) printf("same"); else printf("not same"); 

在此比较中, y将被转换为unsigned int ,以便与已经是unsigned int x进行比较。 由于y具有实现值,因此转换为unsigned int后的值仍然是实现定义的(尽管转换本身是模2 ^ N且已完全指定)。 比较的结果仍然是实现定义的。

总之:

实现定义, UINT_MAX ,实现定义

在实践中补充:

不一样, UINT_MAX ,-0(又名0)

标志加幅度:

不一样, UINT_MAXINT_MIN

两个补码:

同样, UINT_MAX ,-1

它非常简单。 -1的二进制补码表示为0xFFFFFFFF。 因此,这就是x包含的内容。

补码运算符(〜)翻转所有位。 所以0的补码是32位数,所有位都设置为1或0xFFFFFFFF。

编辑:正如他在评论中指出的那样。 答案不是A.如果是,则说0x7FFFFFFF和0xFFFFFFFF是相同的。 他们不是。 真正的答案是C(假设MAXUNIT是拼写错误;))。

这是因为两个补充

位的翻转导致匹配-1的位模式

因为在第一个unsigned int中,你输入-1,但是从unsigned int的角度来看它是0xFFFFFFFF(这是负整数存储到计算机中的方式); 在第二种情况下,按位不会完全不查看“种类”并将“变换”0变为1而反之亦然,因此0的所有0都变为1(查看位),因此您获得0xFFFFFFFF。

接下来的问题是,为什么将无符号整数与有符号整数进行比较并不能区分它们? (数值上4294967295当然不等于-1,即使它们在计算机中的表示是相同的)。 事实上它可以,但显然C并没有强制要求这样的区别,而且它是“自然的”,因为处理器不能自己做(我不确定这最后一句话总是如此,……但是它适用于大多数处理器):要考虑到asm中的这种区别,您必须添加额外的代码。

从C的角度来看,您必须决定是将int转换为unsigned int,还是将int转换为unsigned int。 但是当然,负数不能转换为无符号数,而另一方面,无符号数可能导致溢出(例如,对于4294967295,您需要64位寄存器(或33位寄存器!)才能有它仍然能够计算其负值)…

因此,最自然的事情是避免奇怪的转换,并允许“cpu like”比较,在这种情况下导致0xFFFFFFFF(32位为-1)与0xFFFFFFFF(32位为0)相同,更多在genereal中可以被认为是MAXUINT(可以保持的最大无符号整数),另一个是-1。 (看看你的机器limits.h包括检查)