c - limits.h 中的数据类型大小限制是如何确定的?

标签 c types

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

This question的回答说使用 limits.h 作为数据类型的最小值和最大值。虽然有些人可能会就此打住并说好吧,好吧,我在想:它怎么知道的? limits.h 中的限制是如何设置的,以便您可以在任何机器(任何环境?)上使用相同的 limits.h

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

最佳答案

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

然后,无论谁将编译器移植到给定系统,都必须实现 limits.h(以及 stdint.h)以适应给定系统的编译器.

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

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

然而,Endianess 在这里并不适用,因为这些 header 只涉及可变大小而不是单个字节的寻址。

关于c - limits.h 中的数据类型大小限制是如何确定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52868953/

相关文章:

python - 检查变量是字符串类型还是整数类型

人体高度的 MySQL 变量(tinyint 或 smallint)

types - 求和类型的结构类型

c - c中不使用变量时是否分配内存

C 结构函数语法 - 传递元素,返回结构

C编程: Best data structure for this situation

c++ - 在 Windows 上处理文件名中带有回车符的文件

inheritance - 如何在 typescript 的基类中创建相同类型的实例

c++ - 关于静态函数不使用原型(prototype)的意见

c - 实现二叉树时出现Segmentation Fault (Core Dumped)