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

时间:2011-04-12 21:23:52

标签: c++ c

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

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

1&gt; C:\ path-to-file.cpp(44):警告C4309:'case':截断常量值

1I64&lt;&lt; 31是0x0000000080000000(__ int64)所以这里没有截断, 案件的最大价值是什么?

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

C标准(n1256.pdf)声明

  

6.8.4.2/5对控制表达式执行整数提升。 ...

  

6.3.1.1/2 ...将值转换为int;否则,它将转换为unsigned int ...

我的猜测是,您实现中的int(或unsigned int)不足以容纳64位宽的值。