C++中无符号类型右移操作是否属于实现定义行为?
C++无符号整数右移行为说明
首先给出明确结论:无符号整数类型的右移操作是C++标准明确规定的逻辑右移,不属于实现定义行为,全平台通用。
具体规则细节如下:
- C++所有版本的标准中都明确要求:无符号整数执行右移运算时,高位统一补0,低位被移出丢弃,也就是完全的逻辑右移。运算结果等价于原数除以2的移位次幂的商,向下取整,这个规则在所有符合标准的编译环境下都成立。
- 只有有符号整数的右移属于实现定义行为:当有符号数为非负值时,右移行为和无符号数一致;当有符号数为负值时,右移的实现由编译器和目标架构决定,目前主流x86、ARM平台都实现为高位补符号位的算术右移,仅少数小众平台会对负有符号数执行逻辑右移。
你测试得到的结果完全符合标准要求,不存在平台差异,所有符合C++标准的编译器运行你提供的代码都会输出一致的结果。
内容的提问来源于stack exchange,提问作者Cipri
相关产品推荐
相关产品推荐

