15

这个网站上的几个问题揭示了混合有符号和无符号类型时的陷阱,大多数编译器似乎在生成这种类型的警告方面做得很好。但是,将有符号常量分配给无符号类型时,GCC 似乎并不关心!考虑以下程序:

/* foo.c */
#include <stdio.h>
int main(void)
{
    unsigned int x=20, y=-30;
    if (x > y) {
        printf("%d > %d\n", x, y);
    } else {
        printf("%d <= %d\n", x, y);
    }
    return 0;
}

使用 GCC 4.2.1 进行如下编译不会在控制台上产生输出:

gcc -Werror -Wall -Wextra -pedantic foo.c -o foo

生成的可执行文件生成以下输出:

$ ./foo
20 <= -30

-30将有符号值分配给无符号整数变量时,GCC 是否有任何原因不会生成任何警告或错误消息y

4

3 回答 3

22

使用-Wconversion

~/src> gcc -Wconversion -Werror -Wall -Wextra -pedantic -o signwarn signwarn.c
cc1: warnings being treated as errors
signwarn.c: In function 'main':
signwarn.c:5: error: negative integer implicitly converted to unsigned type

我想这里的问题是 gcc 实际上非常擅长生成警告,但对于(有时是意外的)情况,它默认不这样做。浏览可用的警告并选择一组选项来生成您认为有帮助的选项是个好主意。或者只是所有这些,并完善该代码,直到它发光!:)

于 2010-05-05T08:24:37.050 回答
9

将负值转换为无符号类型的能力是 C 语言的一个特性。因此,默认情况下不发出警告。如果您愿意,您必须明确提出要求。

至于您的程序输出什么......使用%d格式说明符和printf超出类型范围的无符号值会int导致未定义的行为,这是您在实验中真正观察到的。

于 2010-05-05T08:43:10.677 回答
2

Using (unsigned)-1 is an often used way to set all bits and sometimes even quoted as reason for this (mis)feature of C, even by people who should know better . It's neither obvious nor portable -- the expression you want to use to set all bits is ~0 .

于 2016-08-17T21:03:51.740 回答