使Visual Studio警告未签名的比较

时间:2012-04-13 21:33:13

标签: c visual-studio

此代码,使用Visual Studio 2010编译时

#include <cstdlib>
#include <cstdio>

int numbers[] = { 23, 24, 25, 25, 28, 20, 20 };

int main(void) {
    int d = -1, x=0;
    size_t count = sizeof(numbers) / sizeof(numbers[0]);

    if (d <= (sizeof(numbers) / sizeof(numbers[0]))-2)
        x = numbers[d+1];

    if (d <= count-2)
        x = numbers[d+1];
}

if (d <= count-2)上给我签名/未签名的不匹配警告,但在if (d <= (sizeof(numbers) / sizeof(numbers[0]))-2)上没有。为什么是这样?我已启用所有警告。

3 个答案:

答案 0 :(得分:1)

在这种情况下,Visual C ++编译器不会发出警告C4018是一个错误。请参阅Microsoft Connect错误报告"warning C4018 (signed/unsigned mismatch) for sizeof operator."

该问题似乎仅与sizeof的使用间接相关。在比较中涉及无符号类型的常量值的其他情况下,编译器也无法发出警告。例如,如果您向const添加count - 资格,即使是第二次比较,也不会发出C4018。

答案 1 :(得分:0)

我的猜测是,它将2视为一个int,因此提升 因括号而(sizeof(numbers) / sizeof(numbers[0]))-2)为int,因此comaprison为int < int

答案 2 :(得分:0)

size_t被定义为unsigned,因此您会收到签名的无符号冲突。

请注意,由于sizeof在编译期间被评估,并且正在被常量值替换,因此它不会抱怨符号不匹配,但在另一个表达式中,您显式地将值转换为size_t变量当您尝试与签名号码进行比较时,可能会溢出。