【发布时间】:2021-06-18 04:11:22
【问题描述】:
所有,
long long unsigned int bigvalue;
bigvalue = (codeword[0] & 0XFFFC) >> 2;
bigvalue |= (codeword[1] & 0XFFFF) << 14;
bigvalue |= (codeword[2] & 0XFFFF) << 30;
bigvalue |= (codeword[3] & 0XFFFF) << 46;
codeword 是 guint16 类型。
最后一行出现错误:left shift count >= width of type。
缓解的方法是什么?
TIA!!
编辑:
有一个建议的答案。然而问题是完全不同的。我问的是编译器错误,而引用的问题是关于错误的结果。
EDIT2:
为了提供更多的上下文 - 这段代码假设解析 WS 流(它在解析器内部)。代码由 Perl 脚本根据规则集自动生成。我正在尝试解决由于最后一行不存在而导致代码崩溃的问题。
应该解析的字段是 68 位长,它被读入 5 个元素 - 码字 [i]。前面是 2 位指示符,因此第二行是 0xfffc。
我会尝试投射并在明天报告。
谢谢。
EDIT3:
请,请,请停止建议与此完全无关的问题作为解决方案!他们没有任何共同点!!
谢谢。
【问题讨论】:
-
什么是
codeword?请提供一个完整的示例。guint16本身没有任何意义。 -
假设
guint16比 int 窄,那么它将被提升为 int,它在您的平台和 shifting more bits than the width of type invokes UB 中没有 64 位。您必须将左操作数转换为unsigned long long。重复:bit shifting with unsigned long type produces wrong results、Bit-shifting unsigned longs in C -
@Igor 这不是编译器错误。它应该是一个警告,除非您将“警告设置为错误”,以便编译器将其报告为错误
-
确保 RHS 使用
unsigned long long数学:bigvalue |= (codeword[3] & 0XFFFFull) << 46;
标签: c bitwise-operators bit-shift