【发布时间】:2018-06-28 03:19:15
【问题描述】:
C++ 标准
如果C++14
实现包括在 unsigned int 的底层字节中的填充位,标准是否指定是否不能对填充位执行按位运算?
此外,C++14 标准是否指定是否相等和关系
运营商必须忽略填充位?
指南
如果在这方面缺乏规范,是否存在某种形式的 对这些运算符在填充位上的预期行为达成共识?
我在 Stack Overflow 上发现了相互矛盾的答案。 Lightness Races in Orbit 和 ecatmur 表示位运算符不适用于算术,因为它们应用于所有位(包括填充位),而 Christoph 和 Bartek Banachewicz 表示位运算符适用于整数的逻辑值并忽略填充。
参考文献
相关答案:关于填充位的存在 (1, 2, 3), 由于缺乏明确的 C++ 规范 (4)。
C++14 中填充位的定义 - § 3.9.1 - 基本类型:
对于窄字符类型,对象表示的所有位都参与值表示。对于无符号窄字符类型,值表示的所有可能的位模式都表示数字。这些要求不适用于其他类型。
C++14 中对象表示和值表示的定义 - § 3.9 - 类型:
T类型对象的 对象表示 是T类型对象占用的 N 个unsigned char对象的序列,其中 N 等于sizeof(T)。对象的值表示是一组保存T类型值的位。对于普通可复制类型,值表示是对象表示中的一组位,它们确定 值,它是实现定义的一组值的一个离散元素。44脚注 44) 意图是 C++ 的内存模型与 ISO/IEC 9899 编程语言 C 的内存模型兼容。
C++14 中位与的定义 - § 5.11 - 位与运算符:
执行通常的算术转换;结果是操作数的按位与函数。该运算符仅适用于整数或无范围枚举操作数。
C++14 中加法的定义 - § 5.7 - 加法运算符:
对算术或枚举类型的操作数执行通常的算术转换。此外,[...] 两个操作数都应具有算术或无范围枚举类型 [...]。二进制
+运算符的结果是操作数的和。
【问题讨论】:
-
你怎么知道?你唯一能得到的是值,它不包括填充位。
-
@EJP 通过检查对象表示?
-
按位运算是根据值位定义的。它们根本无法访问填充位(除非您将内存重新解释为无符号字符数组)。
-
Related What's the result of a & b? 谈到了按位运算中的一些规范不足。
-
您知道任何使用填充 int 的实际架构吗?我不是。这个概念有点陌生。
标签: c++ c++14 bitwise-operators unsigned-integer unspecified-behavior