首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >填充物需要保存吗?

填充物需要保存吗?
EN

Stack Overflow用户
提问于 2015-07-18 20:01:40
回答 2查看 206关注 0票数 3

MSP430X体系结构是16位MSP430体系结构的扩展,扩展到20位地址空间。这是通过将处理器的寄存器扩展到20位来实现的,使最小寻址单元保持在一个八进制(CHAR_BIT = 8)。

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

在阅读了标准中关于整数类型中填充位的说明之后,我不确定它们应该如何表现。因为在这种情况下,填充只存在于存储中,因此除了类型双关之外,它们的值既不能设置也不能观察。即使如此,复制这20位类型的对象也不会复制任何填充位。这种填充位是否符合ISO 9899:2011的要求?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-18 20:32:20

C标准不要求通过赋值复制填充位。赋值是以值而不是表示形式指定的。

N1570 6.2.6.2p5说:

未指定任何填充位的值。

这是一条不限定的语句,意味着它们在任何情况下都没有指定,即使是在从设置了填充位的对象赋值之后。

就其本身而言,该语句可能被认为是相当模糊的,以至于它没有坚定地确定填充位不一定被复制。

填充位对整数对象的表示不起作用。在引用的句子中有一个脚注说:

填充位的所有其他组合都是由值位指定的值的可选对象表示。

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

6.5.16.1p2在描述简单任务时说:

在简单赋值(=),中,右操作数的值被转换为赋值表达式的类型,并替换存储在左操作数指定的对象中的值。

所描述的是值而不是表示;这并不意味着必须在LHS对象中维护RHS的表示。当然,分配中的RHS可以是一个任意表达式,而不仅仅是一个对象引用。即使它只是一个对象的名称,它也会进行lvalue转换,如6.3.2.1p2所述;这种转换仅指对象的值,而不是它的表示形式。

(在其他地方,标准说参数传递、函数参数传递和从函数返回值就像简单的赋值一样。)

票数 3
EN

Stack Overflow用户

发布于 2015-07-18 20:10:36

通常,该标准对sizeof类型设置了一些约束。基本约束是它必须是char的倍数,sizeof(char)定义为1

对于类型中的填充位,请参考6.2.6.1,它使表示形式大部分是定义的。6.2.6.2p5指出填充位的值未指定;不需要保留,但填充位有两个重要的约束:

  1. 有符号整数中的正值应表示相同无符号类型的相同值。这保证了同一类型的有符号变体和无符号变体之间对于有符号变体范围内的正值的兼容性。
  2. 如果所有位数为零,则表示值0。所以所有的填充位也必须是0。然而,情况并非如此(多亏了MattMcNabb)。

这两个都包括填充位,因为它们是内部表示的一部分。从更实际的角度来看,填充位应该设置为零,除非存在奇偶校验等依赖于其他比特的比特(但是必须满足第二个约束)。

这是一个粗略的解释。如需详细资料,请参阅所引用的其他部分。

在MSP430X上,20位int几乎没有实际用途。它们主要是为了扩展寻址范围,而不是整数算术(尽管指令集显然支持它--我在以前的编辑中错了)。

指针有一个sizeof 32位(4 8位字节),但只使用20位.一些嵌入式编译器可能支持特殊的short/near/..。限定符,有效地提供了两个不同的指针大小。然而,这实际上违反了标准。(我在这里有点矛盾:优化或可移植性)。

MSP430X是使用stdint.h (uintptr_t)和stddef.h (例如size_t)的专用类型是必不可少的的平台之一,因为向int /从int转换指针最终将失败。更重要的是,该标准对(u)intptr_t (临时存储,没有操作)的唯一要求变得清晰起来。这样,就没有任何关于填充位的保证--甚至对于空指针也是如此。

造成这一巨大开销的原因(37.5%未使用比特)是因为MSP430X没有读取/写入20位甚至24位值的功能(这将使数组索引非常昂贵)到内存。只有一些常量可以是20位,因为它们是在指令中使用包括4位和其余16位的扩展字编码的,而其他指令则遵循操作码。这可能是最后一个(小型)体系结构之一,它展示了在保持兼容性的同时,还需要做多少额外的工作来扩展地址空间。

请注意,对于20位寻址模式,MSP430X还有一些额外的缺陷。例如,中断手‘必须驻留在较低的64 bit中,因为向量表只包含16位条目。这实际上禁止在C中将vetor表定义为函数指针数组(因为它们不能自由转换为任何其他函数指针和返回)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31495069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档