为什么这两个数字的比较相等,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;
}
答案 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是相同的。