面向 x86 时在 c++ 中进行算术移位的可靠性

Reliability of having arithmetic shift in c++ when targeting x86

本文关键字:算术移位 可靠性 x86 时在 c++ 面向      更新时间:2023-10-16

所以根据 c++ 规范

E1>> E2 的值是 E1 右移 E2 位位置。如果 E1 有 无符号类型,或者如果 E1 具有有符号类型和非负值, 结果的值是 的商的整数部分 E1/2^E2.如果 E1 具有有符号类型和负值,则生成的 值是实现定义的。

所以它是实现定义的,但是如果我使用针对 x86 平台的无错误编译器,并且使用有符号类型进行右移,是否有任何理由怀疑我不会移入有符号位?(x86明显支持算术移位)

不要将"实现定义"与"未定义"混淆。 "实现定义"字面意思是"实现必须定义它"。 这不是随机的,甚至不是你应该通过实验来确定的。 行为由实现定义,符合标准的实现将记录这些行为详细信息(因为不这样做本身就是不符合)。 除了实现错误之外,程序将忠实地展示其C++实现所定义的行为。

虽然您不能依赖有关未定义行为的任何内容,但您可以依赖实现定义的行为在给定的C++实现中保持一致。 但是,假设同一硬件的不同实现将以相同的方式定义这些细节,甚至假设同一实现的不同版本将以这种方式保持一致,这是不安全的。