任何人都可以解释这个程序的类型推广以及为什么输出相同

时间:2017-04-20 09:12:20

标签: c++ type-promotion

为什么这两个数字的比较相等,x和y之间的比较是如何进行的?

#include <stdio.h>
int  main() 
{ 
   unsigned int x = -1; 
   int y = ~0; //type promotion from int to unsigned int
   if (x == y) 
      printf("same"); 
   else
      printf("not same"); 
   return 0; 
}

1 个答案:

答案 0 :(得分:0)

C ++中的〜运算符(以及其他类C语言,如C和Java)执行按位NOT运算 - 操作数中的所有1位都设置为0,操作数中的所有0位都设置为1。换句话说,它创建了原始数字的补充。有关详细信息,请参阅here

  

按位NOT运算符具有应用时的有趣属性   对于由二进制补码表示的数字,它会改变数字   签名然后减去一个(如上例所示)。

如果你检查〜-operator的作用是什么:

#include <stdio.h>

int  main() 
{ 
   unsigned int x = -1; 
   printf("%i\n",x); // treat data as if singed integer
   printf("%u\n",x); // treat data is if unsigned integer

   int y = ~0; //type promotion from int to unsigned int
   printf("%i\n",y);
   if (x == y) 
      printf("same"); 
   else
      printf("not same"); 
   return 0; 
}

你可以看到:

  

成功时间:0记忆:16064信号:0

     

-1相同

试用here

为什么会这样?

整数为-1的位表示(有关详细信息,请参阅two's complement

11111111 11111111 11111111 11111111 

如果以无符号整数

读取此内容
11111111 11111111 11111111 11111111

是最大的unsigned int。由于环绕,unsigned int中的-1变为最大无符号int数。因此,无符号-1和int~0是相同的。