无符号变量的行为在表现上类似于有符号变量

3
这是代码:
#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

3
查看C语言中当不同类型进行比较或一起参与操作时的类型强制转换规则。当你比较i == -1时,数值-1会被转换为无符号整型,然后进行比较。在这种情况下,-1变成了0xFFFFFFFF,并且匹配了i - lurker
1
C99的第6.3.1.8节“通常算术转换”在https://dev59.com/8lTTa4cB1Zd3GeqPtpbq中有描述。 - jarmod
以下帖子中有关于这个问题的好答案:https://dev59.com/d3I-5IYBdhLWcg3wbHq- - BJU
1
如果(且应当)启用警告编译(例如“-Wall -Wextra”),则在编译时会被警告有符号/无符号类型的比较。你刚刚找到了这些警告的原因,所以请注意它们... - David C. Rankin
2个回答

2
== 运算符会根据 C 语言的提升规则将其操作数提升为公共类型。将 -1 转换为 unsigned 类型会产生 UINT_MAX

1

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

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

[N1570 $6.5.9/4]

在二进制补码表示法中,-1是“所有位都置位”的,对于大小为4的unsigned int来说,0xFFFFFFFF也是如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接