无符号变量的行为类似于signed

时间:2015-08-08 20:14:57

标签: c linux gcc

这是代码,

#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

2 个答案:

答案 0 :(得分:2)

==运算符会根据C的升级规则将其操作数提升为通用类型。将-1转换为unsigned会产生UINT_MAX

答案 1 :(得分:1)

i的值为0xFFFFFFFF,与-1完全相同,至少在后者转换为无符号整数时。这正是比较运算符所发生的事情:

  

如果两个操作数都具有算术类型,则执行通常的算术转换。 [...]

     

[N1570 $ 6.5.9 / 4]

两个补码中的

-1是“所有位设置”,这也是0xFFFFFFFF(大小为4)的unsigned int