gpt4 book ai didi

c++ - 移位计数为负数或错误太大 - 正确的解决方案?

转载 作者:IT老高 更新时间:2023-10-28 21:57:40 31 4
gpt4 key购买 nike

我有以下函数用于读取大端四字(在抽象基文件 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;

问题是我在移位操作的前四行收到 4 个编译器警告:

warning C4293: '<<' : shift count negative or too big, undefined behavior

我了解为什么会出现此警告,但我似乎无法弄清楚如何正确摆脱它。我可以这样做:

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

这消除了警告,但没有其他问题,BYTE 会一直正确延长吗?也许我只是想太多了,解决方案就是这么简单。你们能帮我吗?谢谢。

最佳答案

您删除警告的方式是正确的。正如您可能已经知道的那样,出现警告是因为您试图将字节的内容移动到单词的边界之外,然后将其存储在四字中。此操作未定义。 (它会在赋值之前评估赋值的右侧。)通过先显式转换,现在有足够的空间来进行移位,所以没有什么可提示的。

可以说,编译器应该能够确定您要将它存储在四字中,因此它应该首先分配一个四字并在那里进行移位,但它可能还不够聪明,无法弄清楚.

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

关于c++ - 移位计数为负数或错误太大 - 正确的解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3020913/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com