当前位置:  开发笔记 > 编程语言 > 正文

班次计数为负数或太大错误 - 正确的解决方案?

如何解决《班次计数为负数或太大错误-正确的解决方案?》经验,为你挑选了1个好方法。

我有以下函数用于读取big-endian四字(在抽象基本文件I/O类中):

unsigned long long File::readBigEndQuadWord(){
  unsigned long long qT = 0;
  qT |= readb() << 56;
  qT |= readb() << 48;
  qT |= readb() << 40;
  qT |= readb() << 32;
  qT |= readb() << 24;
  qT |= readb() << 16;
  qT |= readb() << 8;
  qT |= readb() << 0;
  return qT;
}

readb()函数读取BYTE.以下是使用的typedef:

typedef unsigned char   BYTE;
typedef unsigned short  WORD;
typedef unsigned long   DWORD;

问题是我通过shift操作在前四行获得了4个编译器警告:

警告C4293:'<<':移位计数为负数或过大,未定义的行为

我理解为什么会发生这种警告,但我似乎无法弄清楚如何正确摆脱它.我可以这样做:

qT |= (unsigned long long)readb() << 56;

这会删除警告,但是没有任何其他问题,BYTE是否会一直正确扩展?也许我只是想太多而且解决方案很简单.你能帮助我吗?谢谢.



1> lc...:

你删除警告的方法是正确的.正如您可能已经知道的那样,警告正在发生,因为您试图将字节的内容移到字的边界之外,然后将其存储在四字中.此操作未定义.(这将分配值之前评估作业的右侧.)通过明确铸造第一,现在有足够的空间做移位,所以没有什么可抱怨的.

可以说,编译器应该能够找出你要它存储在四字,所以应该首先分配四字,做移位存在,但它可能没有作出足够的智慧来弄明白.

此外,我不确定这一点,但可能为x64编译这个也不会产生警告,因为一个字是64位?


如果编译器确实弄清楚你正在对结果做什么并相应地改变中间类型,那么它将破坏语言标准.类型提升定义良好,运算符的结果类型仅取决于操作数类型.
推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有