You need to enable JavaScript to run this app. RHEL7 64位环境下位移位与操作数宽度相关编译错误咨询
优惠活动
大模型
产品
解决方案
定价
更多

RHEL7 64位环境下位移位与操作数宽度相关编译错误咨询

报错根因

你使用的guint16是16位无符号整数类型,C语言标准规定宽度小于int的整数参与位运算时,会先默认提升为有符号int类型。RHEL7环境下int默认宽度为32位,左移操作的移位计数不能超过类型宽度减1(也就是31),你最后一行代码需要左移46位,远超过32位int的最大合法移位值,因此触发编译报错。

可行解决方案

移位操作执行前,先将codeword元素的位运算结果强转为宽度足够的64位无符号类型即可,同时建议对前几行移位操作也做相同修改,避免触发隐式符号扩展的运行时风险,修正后代码如下:

long long unsigned int bigvalue;
bigvalue = (codeword[0] & 0XFFFC) >> 2;
bigvalue |= ((long long unsigned int)(codeword[1] & 0XFFFF)) << 14;
bigvalue |= ((long long unsigned int)(codeword[2] & 0XFFFF)) << 30;
bigvalue |= ((long long unsigned int)(codeword[3] & 0XFFFF)) << 46;

如果你的工程依赖GLib(你用到了guint16类型说明已引入GLib头文件),也可以用GLib定义的guint64代替long long unsigned int,写法更统一:

long long unsigned int bigvalue;
bigvalue = (codeword[0] & 0XFFFC) >> 2;
bigvalue |= ((guint64)(codeword[1] & 0XFFFF)) << 14;
bigvalue |= ((guint64)(codeword[2] & 0XFFFF)) << 30;
bigvalue |= ((guint64)(codeword[3] & 0XFFFF)) << 46;

内容的提问来源于stack exchange,提问作者Igor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 10:36:04