在我的编译器上,以下伪代码(用二进制替换的值):
sint32 word = (10000000 00000000 00000000 00000000);
word >>= 16;
产生一个 word
具有如下所示的位域:
(11111111 11111111 10000000 00000000)
我可以依赖所有平台和 C++ 编译器的这种行为吗?
原文由 Anne Quinn 发布,翻译遵循 CC BY-SA 4.0 许可协议
在我的编译器上,以下伪代码(用二进制替换的值):
sint32 word = (10000000 00000000 00000000 00000000);
word >>= 16;
产生一个 word
具有如下所示的位域:
(11111111 11111111 10000000 00000000)
我可以依赖所有平台和 C++ 编译器的这种行为吗?
原文由 Anne Quinn 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答1k 阅读✓ 已解决
1 回答932 阅读✓ 已解决
4 回答695 阅读
1 回答804 阅读
2 回答1.2k 阅读
1 回答843 阅读
1 回答602 阅读
从以下链接:
INT34-C。不要将表达式移位负数或大于或等于操作数中存在的位数
不合规代码示例(右移)
E1 >> E2
的结果是E1
右移E2
位位置。如果E1
具有无符号类型或E1
具有有符号类型和非负值,则结果的值是 E1 / 2 E2的商的整数部分。如果E1
具有带符号类型和负值,则结果值是实现定义的,并且可以是算术(有符号)移位:或逻辑(无符号)移位:
这个不兼容的代码示例无法测试右操作数是否大于或等于提升的左操作数的宽度,从而允许未定义的行为。
假设右移是作为算术(有符号)移位还是逻辑(无符号)移位实现的,也可能导致漏洞。见建议 INT13-C。仅对无符号操作数使用位运算符。