【问题标题】:Why does this generate compiler warning "Signed/Unsigned mismatch" only when compiled under x64?为什么只有在 x64 下编译时才会生成编译器警告“有符号/无符号不匹配”?
【发布时间】:2010-11-27 11:56:48
【问题描述】:

考虑这段代码:

LARGE_INTEGER l;
size_t s;
if (s < l.QuadPart) return 1;
return 0;

当它在 x64 下编译时,它会生成 C4018 有符号/无符号不匹配编译器警告(忽略未初始化的局部变量警告)。

警告很好,因为 QuadPartLONGLONG 已签名,size_t 未签名。

但是当我在 32 位下编译时没有警告?怎么会?在 32 位以下,LONGLONG 仍然是有符号的,size_t 是无符号的。

【问题讨论】:

    标签: c++ visual-c++


    【解决方案1】:

    在 32 位上,LONGLONG 等效于 signed __int64size_t 等效于 unsigned intunsigned int 的范围完全适合 signed __int64 范围,因此编译器在比较之前将 size_t 扩大(进行整数提升)到 signed __int64 并且没有警告。

    在 64 位上 LONGLONG 再次等价于 signed __int64size_t 等价于 unsigned __int64,所以现在 size_t 不再适合 LONGLONG 并且编译器无法执行任何类型的自动升级,因此发出警告。

    【讨论】:

    • 我不认为最后的说法是完全正确的。在 64 位的情况下,编译器会提升。它将LONGLONG(相当于signed __int64)提升为size_t(相当于unsigned __int64),就像它会将int提升为unsigned int一样,如果它们是l的变量类型和s。并且编译器发出警告正是因为这种提升破坏了数学上预期的比较行为(即,l 的负值被视为正值,并且无法在数学方面与s 正确比较)。
    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    相关资源
    最近更新 更多