全,
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
。
缓解的方法是什么?
蒂娅!!
编辑:
有一个建议的答案。然而,问题完全不同。我问的是编译器错误,引用的问题是关于错误的结果。
EDIT2:
为了给出更多的上下文--这段代码应该解析WS流(它在解析器中)。代码是由Perl脚本根据规则集自动生成的。我正在尝试修复代码崩溃的问题,因为最后一行不在那里。
应该解析的字段是68位长,它被读入5个元素-- codewordi。其前面是2位指示符,因此第二行为0xfffc。
我会试着选角,明天再汇报。
谢谢。
EDIT3:
求求你,求求你,不要再提完全不相关的问题作为解决方案了!他们没有任何共同点!
谢谢。
发布于 2021-06-18 12:34:15
对于像bigvalue |= (codeword[3] & 0XFFFF) << 46;
这样的表达式,C将首先查看(codeword[3] & 0XFFFF)
并将其提升为unsigned int
(可能是32位);然后尝试将这个中间unsigned int
左移46 (并抱怨移位计数对于“可能是32位”的无符号整数来说太大)。
要解决这个问题,您可以告诉C将中间值提升到更大的大小。例如:
bigvalue |= (long long unsigned int)(codeword[3] & 0XFFFF) << 46;
注意,您也可以使用0xFFFFULL
作为掩码;但是如果codeword[3]
已经是一个无符号的16位整数,那么这个掩码实际上不会做任何有用的事情,并且可以删除。例如:
bigvalue |= (long long unsigned int)codeword[3] << 46;
发布于 2021-06-18 14:00:47
我猜guint16
是16位宽,那么它应该不能左移30位和46位,或者至少结果是零。
https://stackoverflow.com/questions/68029212
复制相似问题