在 C 中,32 位机器和 64 位机器的 long 大小是多少?
In C, what is the size of a long for a 32-bit machine and for a 64-bit machine?
C 中的 long
在 32 位平台上大小为 4 个字节,在 64 位平台上大小为 8 个字节是否正确?
long
的大小(以及一般对象的大小)由 C 实现决定,而不是由执行平台程序决定。
一般来说,C 实现是编译器加上 运行 C 程序所需的库和其他支持软件。1 可以有多个 C 实现对于一个平台。事实上,一个编译器可以通过使用不同的开关来请求各种配置来实现多个C实现。
一般的 C 实现通常使用 short
、int
和 long
的大小,这些大小与目标处理器模型(或多个模型)配合得很好,并为程序员提供了很好的选择。但是,C 实现可以设计用于特殊目的,例如支持用于特定大小 long
的旧代码。一般来说,C 编译器可以为它定义的 long
的任何大小编写指令。
C 标准对对象的大小施加了一些下限。字符中的位数 CHAR_BIT
必须至少为八位。 short
和 int
必须能够表示从 −32767 到 +32767 的值,并且 long
必须能够表示 −2147483647 到 +2147483647。它还要求 long
能够表示所有 int
值,int
能够表示所有 short
值,并且 short
能够表示所有signed char
个值。除此之外,C 标准几乎没有什么要求。它不要求 int
或 long
在特定平台上是特定大小。操作系统对编程语言内部发生的事情没有发言权。操作系统为 运行 程序和与系统的接口设置了要求,但是在程序内部,软件可以做任何它想做的事情。因此,编译器可以根据需要调用 17 位 int
,而操作系统无法控制它。
脚注
1 C 2011 标准(草案 N1570)在第 3.12 条中将实现定义为“特定的软件集,运行在特定的翻译中特定控制选项下的环境,为特定执行环境执行程序翻译,并支持在特定执行环境中执行功能。”
没有。这取决于实施!
唯一的规则是 char
必须 CHAR_BIT
宽,大小必须为:char <= short <= int <= long <= long long
,并且 char
必须至少为 8 位,short
至少 16 位,long
至少 32 位,long long
至少 64 位。
所以实际上所有整数类型(long long 除外)都可以是 32 位宽,只要 CHAR_BIT
设置为 32,C 标准就完全没问题。
C 中的 long
在 32 位平台上大小为 4 个字节,在 64 位平台上大小为 8 个字节是否正确?
long
的大小(以及一般对象的大小)由 C 实现决定,而不是由执行平台程序决定。
一般来说,C 实现是编译器加上 运行 C 程序所需的库和其他支持软件。1 可以有多个 C 实现对于一个平台。事实上,一个编译器可以通过使用不同的开关来请求各种配置来实现多个C实现。
一般的 C 实现通常使用 short
、int
和 long
的大小,这些大小与目标处理器模型(或多个模型)配合得很好,并为程序员提供了很好的选择。但是,C 实现可以设计用于特殊目的,例如支持用于特定大小 long
的旧代码。一般来说,C 编译器可以为它定义的 long
的任何大小编写指令。
C 标准对对象的大小施加了一些下限。字符中的位数 CHAR_BIT
必须至少为八位。 short
和 int
必须能够表示从 −32767 到 +32767 的值,并且 long
必须能够表示 −2147483647 到 +2147483647。它还要求 long
能够表示所有 int
值,int
能够表示所有 short
值,并且 short
能够表示所有signed char
个值。除此之外,C 标准几乎没有什么要求。它不要求 int
或 long
在特定平台上是特定大小。操作系统对编程语言内部发生的事情没有发言权。操作系统为 运行 程序和与系统的接口设置了要求,但是在程序内部,软件可以做任何它想做的事情。因此,编译器可以根据需要调用 17 位 int
,而操作系统无法控制它。
脚注
1 C 2011 标准(草案 N1570)在第 3.12 条中将实现定义为“特定的软件集,运行在特定的翻译中特定控制选项下的环境,为特定执行环境执行程序翻译,并支持在特定执行环境中执行功能。”
没有。这取决于实施!
唯一的规则是 char
必须 CHAR_BIT
宽,大小必须为:char <= short <= int <= long <= long long
,并且 char
必须至少为 8 位,short
至少 16 位,long
至少 32 位,long long
至少 64 位。
所以实际上所有整数类型(long long 除外)都可以是 32 位宽,只要 CHAR_BIT
设置为 32,C 标准就完全没问题。