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