这是代码,
#include <stdio.h>
int main()
{
unsigned int i = 0xFFFFFFFF;
if (i == -1)
printf("signed variable\n");
else
printf("unsigned variable\n");
return 0;
}
这是输出,
signed variable
为什么 i
的价值 -1
即使它被声明为无符号?
是否与隐式类型对话有关?
这是构建环境,
Ubuntu 14.04, GCC 4.8.2
答案 0 :(得分:2)
==
运算符会根据C的升级规则将其操作数提升为通用类型。将-1转换为unsigned
会产生UINT_MAX
。
答案 1 :(得分:1)
i
的值为0xFFFFFFFF
,与-1
完全相同,至少在后者转换为无符号整数时。这正是比较运算符所发生的事情:
两个补码中的如果两个操作数都具有算术类型,则执行通常的算术转换。 [...]
[N1570 $ 6.5.9 / 4]
-1
是“所有位设置”,这也是0xFFFFFFFF
(大小为4)的unsigned int
。