Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无符号变量的行为类似于有符号变量_C_Linux_Gcc - Fatal编程技术网

C 无符号变量的行为类似于有符号变量

C 无符号变量的行为类似于有符号变量,c,linux,gcc,C,Linux,Gcc,这是代码 #include <stdio.h> int main() { unsigned int i = 0xFFFFFFFF; if (i == -1) printf("signed variable\n");

这是代码

#include <stdio.h>                                                                                                                     
int main()
{
    unsigned int i = 0xFFFFFFFF;
    if (i == -1)
        printf("signed variable\n");
    else
        printf("unsigned variable\n");
    return 0;
}
为什么
i
的值
-1
即使声明为未签名的值也是如此? 这与隐式对话有关吗?

这是构建环境

Ubuntu 14.04, GCC 4.8.2

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

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

[N1570$6.5.9/4]


两个补码中的
-1
是“所有位集”,这也是
无符号int
(大小为4)的
0xffffff
的值。

运算符根据C的提升规则将其操作数提升为公共类型。将-1转换为无符号将产生
UINT\u MAX

在比较不同类型或同时参与操作时,请查看C中的类型提升规则。当比较
i==-1
时,值
-
1`被转换为unsigned,然后进行比较。在这种情况下,
-1
变为
0xffffff
,然后匹配
i
。第6.3.1.8节,C99的常用算术转换,如所述。如果(并且您应该)在启用警告的情况下编译(例如
-Wall-Wextra
),下面的帖子中有一个很好的答案,编译时将警告您有符号/无符号类型之间的比较。您刚刚找到警告的原因。注意他们。。。
Ubuntu 14.04, GCC 4.8.2