- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个使用 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 测试。 cpp -o test 我得到第一个 if 语句第二行的 -Wsign-compare 警告(来自 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++ 中的警告。
最佳答案
根据标准中的 [lex.icon],十六进制文字 0xFFF0000000000000LL
的类型为 unsigned long long
,因为该值不适合 long long
(有关这方面的更多信息,请参阅 Unsigned hexadecimal constant in C? 和 C interpretation of hexadecimal long integer literal "L"。)
这意味着 G++ 的警告是正确的,您正在将 long long result
与 unsigned long long
文字进行比较。
显然作为无符号值,123456LL
小于0xFFF0000000000000LL
,所以G++的结果也是正确的。
MSVC 似乎有一个错误 [编辑:或出于兼容性原因表现不同,请参阅评论],因为此断言失败:
static_assert(0xFFF0000000000000LL > 0, "big number is big");
MSVC 给出文字 0xFFF0000000000000LL
类型 long long,如 MSVC 接受的无效代码所示:
auto i = 0xFFF0000000000000LL;
long long& l = i;
一个 C++03 的编译应该没有错误的例子是:
template<typename T>
void f(T t)
{
unsigned long long& l = t;
}
int main()
{
f(0xFFF0000000000000LL);
}
GCC、Clang、Intel 和 Solaris CC 都正确地使用了这个示例,而 VC++ 却错误地使用了它。
关于c++ - -g++ 中的 Wsign-compare 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16834588/
for ( i= 0; i < sizeof(r)/sizeof(r[0]); ++i ){ r[i]= 0; } 这就是我遇到问题的 for 循环,我该如何重写它,这样我就不会收到警
我最近遇到了以下问题。由于它有些棘手,我将其作为 future 人们的问答对。 根据这些问题(Unsigned hexadecimal constant in C?,C interpretation
这是我正在尝试编译的函数: static ssize_t output(t_out_buffer *buf, char const *src, size_t size) { size
当我分配一个成员变量作为大小的数组时,我看到了与我分配一个非成员变量时不同的符号转换警告行为。 如果我用 const int 类型的成员变量创建一个数组,我会得到一个 warning: convers
我最近注意到,当有问题的代码位于函数模板中时,g++ 不会发出有符号/无符号比较警告。这是一个示例: // signed_unsigned.cc #include #include templat
我有以下代码: template struct wrapper { T t; operator T() { return t; } T get() { return t; }
我有一个使用 64 位整数比较的代码。它看起来类似于以下内容: #include long long getResult() { return 123456LL; } int main()
我在使用我的 lex (flex 2.6.0) 扫描器规则时遇到问题,它看起来像: . { /* Place the char back and process statment normally
当编译代码访问结构中的常量以在 malloc 中使用时,我在使用 gcc -Wconversion sample.c 时收到 -Wsign-conversion 警告: sample.c:12:45:
这个问题在这里已经有了答案: Why is the enum incompatible with bit fields in Windows? (1 个回答) 关闭 5 年前。 请向我解释“-Wsi
我的 g++ gcc 版本 5.1.1 20150618 (Red Hat 5.1.1-4) (GCC) 似乎没有出现符号比较错误。 当我使用选项编译以下内容时,我没有收到错误 - 但当我去掉 con
这是一个 SSCCE ,显示了我的代码的简化版本,它仍然做了一些有用的事情: //Compile with -O3 -Wsign-conversion #include #include void
当我使用 g++ 编译我的 C++ 程序时 warning: comparison between signed and unsigned integer expressions [-Wsign-co
我能否将任意宽度的无符号变量中的所有位设置为 1,而不会使用相同的文字触发符号转换错误 (-Wsign-conversion)? 没有 -Wsign-conversion 我可以: #define A
#include #include #include #include using namespace std; int main() { vector vector_double;
我是一名优秀的程序员,十分优秀!