为什么我会收到 1I64<<31 的警告?

Why do I receive a warning for1I64<<31?

本文关键字:lt 警告 1I64 为什么      更新时间:2023-10-16

为什么我收到这个代码的警告?

switch(iInput)
{
   ...
   case 1I64<<31:   return 31;  break;
   ...
}

1>C:path-to-file.cpp(44): warning C4309: 'case':截断常量值

1I64<<31是0x0000000080000000 (__int64),所以这里没有截断,大小写有最大值吗?

控制switch的表达式类型控制case标签将使用的表达式类型。

您需要在控制表达式中使用__int64(或等效)类型来消除警告。

C标准(n1256.pdf)规定

6.8.4.2/5对控制表达式. ...

进行整数提升

6.3.1.1/2……该值被转换为int型;否则,将其转换为unsigned int…

我的猜测是int(或unsigned int)在你的实现是不够大,以容纳64位宽的值。