【发布时间】:2011-07-21 22:41:59
【问题描述】:
我试图理解为什么以下代码没有在指定位置发出警告。
//from limits.h
#define UINT_MAX 0xffffffff /* maximum unsigned int value */
#define INT_MAX 2147483647 /* maximum (signed) int value */
/* = 0x7fffffff */
int a = INT_MAX;
//_int64 a = INT_MAX; // makes all warnings go away
unsigned int b = UINT_MAX;
bool c = false;
if(a < b) // warning C4018: '<' : signed/unsigned mismatch
c = true;
if(a > b) // warning C4018: '<' : signed/unsigned mismatch
c = true;
if(a <= b) // warning C4018: '<' : signed/unsigned mismatch
c = true;
if(a >= b) // warning C4018: '<' : signed/unsigned mismatch
c = true;
if(a == b) // no warning <--- warning expected here
c = true;
if(((unsigned int)a) == b) // no warning (as expected)
c = true;
if(a == ((int)b)) // no warning (as expected)
c = true;
我还以为是后台推广的问题,后面两个好像不是这么说的。
在我看来,第一个 == 比较与其他比较一样多是有符号/无符号不匹配?
【问题讨论】:
-
gcc 4.4.2 在使用 '-Wall' 调用时打印警告
-
这是推测,但它可能会优化所有比较,因为它在编译时知道答案。
-
啊!回覆。 bobah 的评论:我打开了所有警告,现在出现了丢失的警告。我认为它应该出现在与其他比较相同的警告级别设置中。
-
@bobah:我真的很讨厌 gcc 4.4.2 打印那个警告(没有办法告诉它只打印不等式),因为所有消除该警告的方法都会使事情变得更糟 。默认提升可靠地将 -1 或 ~0 转换为任何无符号类型的最高可能值,但如果您通过自己强制转换来消除警告,则您必须知道 exact 类型。因此,如果您更改类型(将其扩展为 unsigned long long),您与裸
-1的比较仍然有效(但会发出警告),而您与-1u或(unsigned)-1的比较都将失败。跨度> -
我不知道您为什么需要警告,以及为什么编译器无法使其正常工作。 -1 为负数,因此小于任何无符号数。简单。
标签: c++ visual-studio-2005 comparison unsigned signed