考虑以下代码:
LARGE_INTEGER l;
size_t s;
if (s < l.QuadPart) return 1;
return 0;
Run Code Online (Sandbox Code Playgroud)
当在x64下编译它时,它会生成C4018签名/未签名的不匹配编译器警告(忽略未初始化的本地变量警告).
该警告是很好的,因为QuadPart是LONGLONG被签名和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 __int64但size_t等同于unsigned __int64,所以现在size_t不再适合LONGLONG并且编译器不能自动执行任何类型的提升,因此警告.