我有一个使用 64 位整数比较的代码。它看起来类似于以下内容:
#include <cstdio>
long long getResult()
{
return 123456LL;
}
int main()
{
long long result = getResult();
if (result > 0x000FFFFFFFFFFFFFLL
|| result < 0xFFF0000000000000LL)
{
printf("Something is wrong.\n");
if (result > 0x000FFFFFFFFFFFFFLL
|| result < -4503599627370496LL)
{
printf("Additional check failed too.\n");
}
else
{
printf("Additional check went fine.\n");
}
}
else
{
printf("Everything is fine.\n");
}
return 0;
}
当此代码在 g++ 中编译(在 Ubuntu 12.04 x64 上尝试不同版本:4.6.3、4.6.4、4.7.3、4.8.0)时,带有标志 -Wall -pedantic -std=c++0x test.cpp -o测试我收到 -Wsign-compare 第一个 if 语句第二行的警告(从 g++-4.8 输出):
test.cpp:13:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
|| result < 0xFFF0000000000000LL)
^
当测试程序运行时,我得到两行文本:
Something is wrong.
Additional check went fine.
在 Windows 上使用 MS Visual Studio 11 Express Update 2 和 x86 或 x64 架构的默认项目选项编译相同的代码时,我既没有收到警告也没有收到此输出,而是输出:
Everything is fine.
是不是代码有问题?如果是的话,你能指出来吗?还是使用的编译器有问题?
在第一个 if 语句中为第二个常量添加额外的类型转换会删除 g++ 中的警告。