为什么只有在x64下编译时才会生成编译器警告"Signed/Unsigned mismatch"?

Ami*_*t G 3 c++ visual-c++

考虑以下代码:

LARGE_INTEGER l;
size_t s;
if (s < l.QuadPart) return 1;
return 0;
Run Code Online (Sandbox Code Playgroud)

当在x64下编译它时,它会生成C4018签名/未签名的不匹配编译器警告(忽略未初始化的本地变量警告).

该警告是很好的,因为QuadPartLONGLONG被签名和size_t未签名.

但是当我在32位下编译它时没有警告?怎么会?32位以下LONGLONG仍然size_t是已签名且未签名.

sha*_*oth 12

在32位LONGLONG上相当于signed __int64并且size_t相当于unsigned int.unsigned 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`正确比较). (2认同)