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
相关产品推荐
相关产品推荐

