C++ 标准
如果C++14
实现在 a 的底层字节中包含填充位,unsigned int
标准是否指定是否不得对填充位执行按位运算?
此外,C++14 标准是否指定相等和关系运算符是否必须忽略填充位?
指导方针
如果在这个问题上缺乏规范,是否对这些运算符在填充位上的预期行为达成某种共识?
我在 Stack Overflow 上发现了相互矛盾的答案。Orbit和ecatmur中的 Lightness Races说按位运算符不适用于算术,因为它们适用于所有位(包括填充位),而Christoph和Bartek Banachewicz说按位运算符处理整数的逻辑值并忽略填充。
参考
相关答案:关于填充位(1、 2、 3)的存在,关于缺乏明确的 C++ 规范(4)。
C++14中填充位的定义- § 3.9.1 - 基本类型:
对于窄字符类型,对象表示的所有位都参与值表示。对于无符号窄字符类型,值表示的所有可能的位模式都表示数字。这些要求不适用于其他类型。
C++14 中对象表示和值表示的定义 - § 3.9 - 类型:
类型对象的对象表示是类型对象占用的N
T
个对象的序列,其中N等于。对象的值表示是保存 type 值的一组位。对于普通可复制类型,值表示是对象表示中确定值的一组位,该值是实现定义的一组值的一个离散元素。44unsigned char
T
sizeof(T)
T
脚注 44) 意图是 C++ 的内存模型与 ISO/IEC 9899 编程语言 C 的内存模型兼容。
C++14 中位与的定义 - § 5.11 - 位与运算符:
执行通常的算术转换;结果是操作数的按位与函数。该运算符仅适用于整数或无范围的枚举操作数。
C++14 中加法的定义 - § 5.7 - 加法运算符:
对算术或枚举类型的操作数执行通常的算术转换。此外,[...] 两个操作数都应具有算术或无范围枚举类型 [...]。二元
+
运算符的结果是操作数的和。