首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按位移位与操作数大小(RHEL7 64位)

按位移位与操作数大小(RHEL7 64位)
EN

Stack Overflow用户
提问于 2021-06-18 12:11:23
回答 2查看 53关注 0票数 1

全,

代码语言:javascript
运行
复制
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:

求求你,求求你,不要再提完全不相关的问题作为解决方案了!他们没有任何共同点!

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2021-06-18 12:34:15

对于像bigvalue |= (codeword[3] & 0XFFFF) << 46;这样的表达式,C将首先查看(codeword[3] & 0XFFFF)并将其提升为unsigned int (可能是32位);然后尝试将这个中间unsigned int左移46 (并抱怨移位计数对于“可能是32位”的无符号整数来说太大)。

要解决这个问题,您可以告诉C将中间值提升到更大的大小。例如:

代码语言:javascript
运行
复制
    bigvalue |= (long long unsigned int)(codeword[3] & 0XFFFF) << 46;

注意,您也可以使用0xFFFFULL作为掩码;但是如果codeword[3]已经是一个无符号的16位整数,那么这个掩码实际上不会做任何有用的事情,并且可以删除。例如:

代码语言:javascript
运行
复制
    bigvalue |= (long long unsigned int)codeword[3] << 46;
票数 1
EN

Stack Overflow用户

发布于 2021-06-18 14:00:47

我猜guint16是16位宽,那么它应该不能左移30位和46位,或者至少结果是零。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68029212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档