【问题标题】:How are the datatype size limits in limits.h determined?limits.h 中的数据类型大小限制是如何确定的?
【发布时间】:2019-03-22 23:07:48
【问题描述】:

C 中数据类型的大小限制是如何确定的?

This question's answers 说使用limits.h 作为数据类型的最小值和最大值。尽管有些人可能会停下来说好吧,好吧,我在想:它怎么知道? limits.h 中的限制是如何设置的,以便您可以在任何机器(任何环境?)上使用相同的 limits.h

显然,32 位机器处理事情的方式与 64 位机器不同。然后你就有了小端与大端的复杂性。它是怎么知道的(用简单的英语)?

【问题讨论】:

  • 它只是硬编码在每个编译器版本/平台的编译器头文件中
  • @Jean-FrançoisFabre 那么有人的工作就是填写这些字段吗? “嘿,我想为这个处理器做一个编译器”......然后我必须打电话给制造处理器的公司并获得规格,然后从中得出可能的值?是这样的吗?
  • 编译/生成编译器时,编译脚本也会创建/生成/实例化limits.h头文件,因为它们确切地知道它的目标是哪个CPU(使用条件#define,你可以有一个限制.h 文件用于多种架构)。是的,要为 CPU 创建编译器,您必须准确了解 CPU 规格:)
  • 创建编译器很困难。这就是为什么每个人都不会创建自己的并依赖现有的:)
  • “那我得打电话给制造处理器的公司并获得规格”是的。您还想询问寄存器的数量和名称、调用约定 (ABI)、CPU 的指令集以及更多详细信息。 limits.h 的值只是其中的一小部分。

标签: c types


【解决方案1】:

首先,C 标准设定了最低要求。例如,int 必须足够大,至少可以容纳 -32767 到 32767 的值。但标准没有设置编译器使用的上限。

然后从那里,将编译器移植到给定系统的任何人都必须实现limits.h(以及stdint.h)以适应给定系统的编译器。

int 的大小传统上设置为 CPU 的数据总线宽度,或者更确切地说是 CPU 在单个指令中可以处理的最大可能大小。但这不是要求 - 对于 64 位 CPU,编译器将 int 保留为 32 位,而是让 longlong long 为 64 位类型。

此外,签名格式也很重要。绝大多数现实世界的计算机都使用 2 的补码,因此 2 的补码系统上 16 位类型的下限是 -32768 而不是 -32767 作为标准的最低要求。这是因为该标准接受其他一些非常奇特的签名格式。

但字节序并不适用于此,因为这些标头只涉及可变大小,而不涉及单个字节的寻址。

【讨论】:

  • 好眼光。在我选择标准的所有时间里,我从来没有注意到两个恭维实现和标准之间的-32768-32767 最小差异。 (坦率地说,我也从未想过:)
猜你喜欢
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2017-10-22
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多