Ral*_*phS 10 c++ bitwise-operators unsigned-integer unspecified-behavior c++14
如果C++ 14
实现在a的基础字节中包含填充位unsigned int,那么标准是否指定是否必须在填充位上执行按位运算?
另外,C++ 14标准是否指定相等和关系运算符是否必须忽略填充位?
如果在这个问题上缺乏规范,那么这些运算符在填充位上的预期行为是否存在某种共识?
我在Stack Overflow上找到了相互矛盾的答案.轨道中的亮度竞赛和ecatmur说,按位运算符不适用于算术,因为它们应用于所有位(包括填充位),而Christoph和Bartek Banachewicz表示按位运算符处理整数的逻辑值并忽略填充.
相关的答案:在填充比特的存在(1, 2, 3),在没有明确的C++规范(4).
C++中填充位的定义14 - 第3.9.1节 - 基本类型:
对于窄字符类型,对象表示的所有位都参与值表示.对于无符号窄字符类型,值表示的所有可能位模式表示数字.这些要求不适用于其他类型.
C++中对象表示和值表示的定义14 - §3.9 - 类型:
类型对象的对象表示是由类型对象占据
T的N个unsigned char对象的序列T,其中N等于sizeof(T).对象的值表示是保存type值的位集T.对于简单的可复制类型,值表示是对象表示中的一组位,用于确定值,该值是实现定义的值集的一个离散元素.44脚注44)意图是C++的内存模型与ISO/IEC 9899编程语言C的内存模型兼容.
C++中按位AND的定义14 - §5.11 - 按位AND运算符:
执行通常的算术转换; 结果是操作数的按位AND功能.运算符仅适用于整数或无范围的枚举操作数.
C++中添加的定义14 - 第5.7节 - 附加运算符:
对算术或枚举类型的操作数执行通常的算术转换.另外,[...]两个操作数都应具有算术或无范围的枚举类型[...].二元
+运算符的结果是操作数的总和.
如果实现指定了包含填充位的整数类型的存储格式,则在写入对象时,它可以向这些位写入任何它喜欢的内容,并且可以对这些位必须保存的值施加它认为合适的任何要求,以任意方式表现如果不满足该要求,则受到两个约束:
如果对该类型的对象的任何写入产生了特定的位模式,则该位模式必须是可接受的,并且在从该类型的任何对象读取时必须产生相同的值。
如果整数类型对象的所有位均为零,则该对象必须被视为有效并且必须读取为零。
如果实现忽略读取时的填充位,则按位运算符可能会影响它们,也可能不会以实现认为合适的任何方式影响它们。如果实现要在多字节整数中“1”位的总数为奇数时捕获,但始终写入使总奇偶校验为偶数的填充位值,则需要按位运算符来计算基于的奇偶校验位数据位并正确写入。
| 归档时间: |
|
| 查看次数: |
492 次 |
| 最近记录: |