c - C语言规范是否保证short的大小总是char大小的两倍?
问题描述
根据我的研究,这些是我能找到的关于这些内置整数数据类型的唯一保证:
char
不会小于 8 位short
不会小于 16 位short
不会小于char
在实践中,根据我的经验,short
它的大小始终是 的两倍char
,但似乎这并不是 C 语言规范做出的保证。似乎 16 位char
和 16 位之类的场景short
仍然有效。
这更像是一个好奇的问题,我意识到如果你真的需要整数数据类型的精确宽度,你最好使用stdint.h
标题。
2021 年 5 月 6 日更新:我不相信这个问题与哪些平台有 8 位字符以外的东西的重复?. 我不是在询问 a 的具体大小char
,而是询问 achar
和 a之间的比率short
,而不管其中任何一个的实际大小。至少对我来说,这些答案中的许多都以“重复”问题没有的方式启发了我。我希望这也可以帮助其他偶然发现它的人。
解决方案
正如一些人已经指出的那样,规范对内置类型的“位宽”没有任何保证,如何定义这些是由给定架构的编译器实现的。
可能更有趣的是如何在实践中使用它。事实上,有些“当前”架构具有不遵循通常的 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为例。
推荐阅读
- c++ - 计算数组各行的总和
- java - 调用时方法未显示
- php - 基于键匹配的未设置数据
- elasticsearch - 多个文件节拍到一个logstash。如何优化配置
- python - 在 view.py 文件顶部与在每个函数中编写 import 有什么区别?
- php - is there an alternative for X_SUB_MSISDN?
- triggers - Incorrect space in cleartool trigger name prevent me from removing it
- c# - 具有单个参数的多个 GET() 方法导致 AmbiguousMatchException:请求匹配多个端点
- spring-boot - 我可以将 Xfire 与 SpringBoot 一起使用吗?
- laravel - 没有nodejs的laravel广播通知