2012-04-13 71 views
0

此代码,当使用Visual Studio 2010让Visual Studio中警告无符号比较

#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)警告。为什么是这样?我已启用全部警告。

回答

1

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

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

0

我的猜测是,它把2为int所以促进 (sizeof(numbers)/sizeof(numbers[0]))-2)为int,因为支架等等comaprison是让你获得一个签名签名冲突int < int

+0

去除-2也没有标志断声明具有符号不匹配 – Abhijit 2012-04-13 21:44:01

+0

这将是倒退。当操作数具有混合的符号性和无符号的类型具有比所述签名类型相等或更高的秩和这两种类型的具有比相等或更高秩'int',已签名的操作数转换为无符号的类型。因此,在这里,操作数的类型为int和size_t,int操作数(d)被转换为size_t(产生一个非常大的正数),并且对这两个操作数进行比较'size_t'值。 – 2012-04-13 23:15:35

0

size_t被定义为无符号。

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

+2

'sizeof'表达式也是'size_t'类型。 – 2012-04-13 21:39:09

+0

@JamesMcNellis:sizeof返回一个编译时间常量,所以比较恰好与不带有无符号变量的常量进行比较。 – Abhijit 2012-04-13 21:47:25

+0

该值仍然是'size_t'类型。在编译时或运行时评估表达式不会影响表达式中涉及的类型。程序中没有任何内容不能在编译时计算。 – 2012-04-13 21:49:22

相关问题