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

Tho*_*mas 0 c++ x86

所以根据c ++规范

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

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

Joh*_*ger 5

不要将"实现定义"与"未定义"混淆."实施定义"在字面上意味着"实施必须定义它".它不是随机的,甚至是你应该通过实验确定的东西.行为由实现定义,符合标准的实现将记录这些行为细节(因为不能这样做本身是不符合的).除了实现错误,程序将忠实地展示其C++实现定义的行为.

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