gpt4 book ai didi

c - 是否需要保留填充位?

转载 作者:行者123 更新时间:2023-12-04 12:21:17 27 4
gpt4 key购买 nike

MSP430X 架构是 16 位 MSP430 架构到 20 位地址空间的扩展。这是通过将处理器的寄存器扩展到 20 位,将最小可寻址单元保持在一个八位字节(CHAR_BIT 等于 8)来实现的。

在这种架构上,可以想到 C 编程语言的一种实现,它为 int 提供 20 位整数类型,使用 8 位 char,一个 16位 short 和模拟的 32 位 long。由于 20 不是 CHAR_BIT 的倍数,因此在存储 int 类型的变量时需要一些填充位。例如,可以用四个字节存储一个 int,留下一个字节和另一个字节的四位作为填充。

在阅读了标准关于整数类型的填充位的内容后,我不确定它们应该如何表现。由于在这种情况下填充仅用于存储,因此它们的值既不能设置也不能观察,除非通过类型双关。即便如此,复制这个 20 位类型的对象也不会复制任何填充位。 ISO 9899:2011 是否允许这种填充位?

最佳答案

C 标准不要求通过赋值复制填充位。赋值是根据值而不是表示来指定的。

N1570 6.2.6.2p5 说:

The values of any padding bits are unspecified.

这是一个不合格的陈述,暗示它们在所有情况下都是未指定的,即使在从设置了一些填充位的对象赋值之后也是如此。

就其本身而言,该声明可能被认为不够明确,以至于它不能确定填充位不一定被复制。

填充位对整数对象的表示没有贡献。引用句子的脚注说:

All other combinations of padding bits are alternative object representations of the value specified by the value bits.

(“其他”是指陷阱表示。)

6.5.16.1p2,描述简单赋值,说:

In simple assignment (=), the value of the right operand is converted to the type of the assignment expression and replaces the value stored in the object designated by the left operand.

描述是根据而不是表示;没有暗示必须在 LHS 对象中维护 RHS 的表示。当然,赋值中的 RHS 可以是任意表达式,而不仅仅是对象引用。即使它只是一个对象的名称,它也会进行 左值转换,如 6.3.2.1p2 中所述;此转换仅指对象的值,而不是其表示。

(在其他地方,标准表示参数传递、函数参数传递和从函数返回值的行为类似于简单赋值。)

关于c - 是否需要保留填充位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31495069/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com