首页 > 解决方案 > C语言规范是否保证short的大小总是char大小的两倍?

问题描述

根据我的研究,这些是我能找到的关于这些内置整数数据类型的唯一保证:

在实践中,根据我的经验,short它的大小始终是 的两倍char,但似乎这并不是 C 语言规范做出的保证。似乎 16 位char和 16 位之类的场景short仍然有效。

这更像是一个好奇的问题,我意识到如果你真的需要整数数据类型的精确宽度,你最好使用stdint.h标题。

2021 年 5 月 6 日更新:我不相信这个问题与哪些平台有 8 位字符以外的东西的重复?. 我不是在询问 a 的具体大小char,而是询问 achar和 a之间的比率short,而不管其中任何一个的实际大小。至少对我来说,这些答案中的许多都以“重复”问题没有的方式启发了我。我希望这也可以帮助其他偶然发现它的人。

标签: cspecifications

解决方案


正如一些人已经指出的那样,规范对内置类型的“位宽”没有任何保证,如何定义这些是由给定架构的编译器实现的。

可能更有趣的是如何在实践中使用它。事实上,有些“当前”架构具有不遵循通常的 1-2-4-8 约定的内置大小。Analog Devices SHARC就是一个很好的例子(也是我个人经验丰富的例子)。

从维基百科页面:

它对 8 位或 16 位值一无所知,因为每个地址都用于指向整个 32 位字,而不仅仅是一个八位字节。因此,它既不是 little-endian 也不是 big-endian,尽管如果编译器实现 64 位数据和/或以某种方式将多个 8 位或 16 位值打包到单个 32 位字中,则它可以使用任一约定。ADI 公司选择在其 C 编译器中使用 32 位字符来避免该问题。

32 位字符绝对可以称为“病态”情况,但它适用于广泛用于专业和专业音频应用的 SHARC。以Universal Audio 的Apollo为例。


推荐阅读