面向 x86 时在 c++ 中进行算术移位的可靠性
Reliability of having arithmetic shift in c++ when targeting x86
所以根据 c++ 规范
E1>> E2 的值是 E1 右移 E2 位位置。如果 E1 有 无符号类型,或者如果 E1 具有有符号类型和非负值, 结果的值是 的商的整数部分 E1/2^E2.如果 E1 具有有符号类型和负值,则生成的 值是实现定义的。
所以它是实现定义的,但是如果我使用针对 x86 平台的无错误编译器,并且使用有符号类型进行右移,是否有任何理由怀疑我不会移入有符号位?(x86明显支持算术移位)
不要将"实现定义"与"未定义"混淆。 "实现定义"字面意思是"实现必须定义它"。 这不是随机的,甚至不是你应该通过实验来确定的。 行为由实现定义,符合标准的实现将记录这些行为详细信息(因为不这样做本身就是不符合)。 除了实现错误之外,程序将忠实地展示其C++实现所定义的行为。
虽然您不能依赖有关未定义行为的任何内容,但您可以依赖实现定义的行为在给定的C++实现中保持一致。 但是,假设同一硬件的不同实现将以相同的方式定义这些细节,甚至假设同一实现的不同版本将以这种方式保持一致,这是不安全的。
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- C / C++ 移位/偏移/向左或向右移动位图?
- 为什么std::valarray不是算术的
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 算术序列与区间的最大重叠
- 为什么简单的算术减法在"if"条件下不起作用?
- 算术运算的结果类似于:C浮点变量中的1/3
- 算术复合运算符重载为非成员
- 尝试使用算术运算符阻止隐式转换
- C++通常的算术转换不转换
- 你能在C++的数组 i,e(+、-、*、/) 中存储算术运算符吗?
- 在提升::bimap中移位值
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 我可以制作矢量对象的算术表达式吗?
- std::byte 指针应该用于指针算术吗?
- 与指针算术混淆
- C++语法差异:二维和一维数组(指针算术)
- 面向 x86 时在 c++ 中进行算术移位的可靠性
- 存在算术右位移位的实际用例
- c++中的算术与逻辑移位操作