【问题标题】:C does not precisely specify the width of each data typeC 没有精确指定每种数据类型的宽度
【发布时间】:2019-03-16 02:08:22
【问题描述】:

根据C_data_types 上的维基百科文章,有一部分提到了任何数据类型都可以是 64 位的:

整数类型的实际大小因实现而异。该标准仅要求数据类型之间的大小关系以及每种数据类型的最小大小

关系要求是long long不小于long,long不小于int,不小于short。由于 char 的大小始终是支持的最小数据类型,因此没有其他数据类型(位域除外)可以更小。

char 的最小大小为 8 位,short 和 int 的最小大小为 16 位,long 为 32 位,long long 必须至少包含 64 位。

int 类型应该是目标处理器最有效地使用的整数类型。 这提供了很大的灵活性:例如,所有类型都可以是 64 位。然而,几种不同的整数宽度方案(数据模型)很流行。因为数据模型定义了不同程序的通信方式,所以在给定的操作系统应用程序接口中使用统一的数据模型。[8]

然而,当我在大多数机器上用 C 编码时,我确实观察到了清晰的数据类型大小。本文是否只是说存在一个统一的数据模型(由大多数操作系统强制执行),该模型强制数据类型的大小以允许跨程序/机器轻松通信?

【问题讨论】:

  • 那是因为 36 位和 60 位字的有趣机器不再广泛使用。一切都是无聊的 8、16、32、64,……位。时间是机器使用 16 位的 int;仍然很少有人这样做(无论如何,在嵌入式空间的低端之外)。许多机器中也没有任何 64 位类型。
  • 从某种意义上说,用户社区通过比允许的更严格的 C 强制执行“统一数据模型” - 规范。例子。当char/unsigned char/signed char 范围不是int/unsigned 的较小范围时,在C 中是允许的,所有地狱都以fgetc() 爆发。 C 允许INT_MAX == UINT_MAX,但这会破坏许多假定 INT_MAX == UINT_MAX/2 的代码。

标签: c types size


【解决方案1】:

然而,当我在大多数机器上使用 C 编码时,我确实观察到了清晰的数据类型大小。

类型的宽度在任何一种特定的 C 实现中都是固定的。 Wikipedia 文章告诉您它们在不同的 C 实现中可能会有所不同。

为此,C 实现是由特定编译器及其相关工具(链接器、标准 C 库)以及与它一起使用的设置提供的实现。 (一些编译器具有用于为某些类型选择不同宽度的开关。这些设置的每次选择在技术上都是不同的 C 实现。)

没有统一的数据模型。有很常见的模型。操作系统不能强制类型宽度(部分原因是计算机实际上是通用图灵机),除非如果类型不匹配,与操作系统进行通信可能会很麻烦。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
相关资源
最近更新 更多