通过 OpenWatcom,我们(一位同事和我自己)收到以下警告:
Warning! W124: Comparison result always 0
我们拥有的代码当然是一个更大项目的一部分,但是导致警告的代码段相当于:
typedef unsigned __int64 uint64_t; /* typedef'd depends on compiler/platform */
uint64_t x;
/* x gets a value */
if (x > 0xFFFFFFFFU) /* <-- warning */
{
/* do something */
}
我认为应该将字面值提升为 的整数类型x
,但显然不是。
是什么赋予了?整数提升规则是否不适用于 64 位整数?
唯一的解决方案是显式转换 ( (x > (uint64_t)0xFFFFFFFFU)
) 还是类似的比较0xFFFFFFFFULL
?类型转换实际上会使警告消失,但我没有查看生成的代码来验证它是否仍然有意义。
笔记:
- 代码不编译为 C99,它使用 C89 和 C99 之间的东西(例如,包括 C++ 风格的单行注释)。
- Watcom 和 OpenWatcom 只是我们的一些团队成员使用的编译器,而 OpenWatcom 是唯一在那里抱怨的编译器。