【问题标题】:In C, what is the size of a long for a 32-bit machine and for a 64-bit machine? [duplicate]在 C 语言中,对于 32 位机器和 64 位机器,long 的大小是多少? [复制]
【发布时间】:2018-12-02 10:08:18
【问题描述】:

C 中的long 对于 32 位平台的大小为 4 字节,对于 64 位平台的大小为 8 字节,这是否正确?

【问题讨论】:

标签: c long-integer


【解决方案1】:

long 的大小(以及一般对象的大小)由 C 实现决定,而不是执行的平台程序。

一般来说,C 实现是一个编译器加上运行 C 程序所需的库和其他支持软件。1 一个平台可以有多个 C 实现。事实上,一个编译器可以通过使用不同的开关来请求不同的配置来实现多个 C 实现。

一般的 C 实现通常使用 shortintlong 的大小,它们与目标处理器模型(或多个模型)配合良好,并为程序员提供了良好的选择。但是,可以为特殊目的设计 C 实现,例如支持用于特定大小 long 的旧代码。一般来说,C 编译器可以为它定义的任何大小的long 编写指令。

C 标准对对象的大小施加了一些下限。字符中的位数CHAR_BIT 必须至少为八位。 shortint 必须能够表示从 -32767 到 +32767 的值,long 必须能够表示 -2147483647 到 +2147483647 的值。它还要求long 能够表示所有int 值,int 能够表示所有short 值,并且short 能够表示所有signed char 值。除此之外,C 标准几乎没有要求。它不要求intlong 在特定平台上是特定大小。操作系统对编程语言内部发生的事情没有发言权。操作系统为运行程序和与系统交互设置了要求,但是,在程序内部,软件可以做任何它想做的事情。因此,编译器可以根据需要调用 17 位 int,而操作系统无法控制。

脚注

1 C 2011 标准(草案 N1570)在第 3.12 条中将实现定义为“在特定控制选项下在特定翻译环境中运行的一组特定软件,它执行用于特定执行环境的程序,并支持在特定执行环境中执行功能。”

【讨论】:

  • C 实现一般需要符合操作系统的 ABI。
  • @Barmar:操作系统是实现的一部分。
  • 如果是这样,那么 32 位操作系统 = 32 位 C,64 位操作系统 = 64 位 C,对吧?
  • @Barmar:不。通用计算机实际上是图灵完备的。这意味着您可以在任何通用计算机上执行任何计算(直到硬件的物理边界)。你可以在 64 位机器上用 16 位 int 编写 C 编译器,你可以在 16 位机器上用 64 位 int 编写 C 编译器。 C 标准不需要 C 实现来提供与操作系统的直接接口。它只需要标准库例程,并且可以编写这些例程来执行任何必要的调整以与操作系统一起工作。
【解决方案2】:

没有。这取决于执行!

唯一的规则是 char 必须是 CHAR_BIT 宽,并且大小必须是:char <= short <= int <= long <= long longchar 必须至少为 8 位,short 至少为 16 位,long 在至少 32 位,long long 至少 64 位。

所以实际上所有整数类型(long long 除外)都可以是 32 位宽,只要将 CHAR_BIT 设置为 32,C 标准就可以做到这一点。

【讨论】:

  • 我不这么认为。 sizeof(char) 被定义为 1。如果所有大小都是 4 字节的倍数会很奇怪
  • @pm100: sizeof 以字符数定义。不是字节。所以 sizeof(char) 始终为 1。即使它是 32 位宽。
  • @pm100:C 标准将字节定义为“可寻址的数据存储单元,大到足以容纳执行环境的基本字符集的任何成员。” C 实现可能使用 32 位字节。
  • @ZanLynx:还有其他规则。 CHAR_BIT 必须至少为 8,实际上,shortint 必须至少为 16 位,long 必须至少为 32。
猜你喜欢
  • 2011-02-05
  • 1970-01-01
  • 2013-12-05
  • 2019-08-21
  • 2020-08-18
  • 2017-02-08
  • 2010-09-27
相关资源
最近更新 更多