本问题已经有最佳答案,请猛点这里访问。
对于32位平台,C中的long的大小为4字节,而对于64位平台,为8字节是否正确?
通常,但不一定。 如果要使用固定大小的类型,请使用int32_t或int64_t。
long的最小大小为32位,仅此而已。
取决于特定的平台。 long至少为32位,但通常为64位。 int至少为16位,并且其位数永远不会少于long。 这些都是语言所做出的保证。
zh.wikipedia.org/wiki/64-bit_computing#64-bit_data_models
取决于数据模型,它们具有正式名称。 LLP64和LP64是常见的。 zh.wikipedia.org/wiki/64-bit_computing#64-bit_data_models。
抱歉,汉斯,LLP64 and LP64 are the common ones.并不常见,未定义。
不,这取决于实施!
唯一的规则是char必须是CHAR_BIT宽,并且大小必须是:char <= short <= int <= long <= long long和char必须至少为8位,short至少为16位,long至少为32位和long long至少64位。
因此,实际上所有整数类型(长整型除外)都可以是32位宽,并且只要CHAR_BIT设置为32,C标准就可以很好地满足要求。
我不这么认为。 sizeof(char)定义为1。所有大小均为4字节的倍数会很奇怪
@ pm100:sizeof以字符数定义。不是字节。因此,sizeof(char)始终为1。即使它是32位宽。
@ pm100参见stackoverflow.com/questions/2215445/
@ pm100:C标准将字节定义为"数据存储的可寻址单元,其大小足以容纳执行环境的基本字符集的任何成员。" C实现可使用32位字节。
@ZanLynx:还有其他规则。 CHAR_BIT必须至少为8,并且实际上short和int必须至少为16位,而long必须至少为32位。
@ZanLynx在C中,根据定义,char是一个"字节"。 C定义一个字,一个字节至少为8位,但可以更多。因此,sizeof是根据字符定义的,等效地是根据字节定义的。
只是说如果计算机的对象不小于32位会很奇怪
long的大小(通常是对象的大小)由C实现确定,而不是平台程序在其上执行。
一般而言,C实现是编译器加上运行C程序所需的库和其他支持软件。1一个平台可以有多个C实现。实际上,一个编译器可以通过使用不同的开关来请求各种配置来实现多种C实现。
一般的C实现通常使用short,int和long的大小与目标处理器模型(或多个模型)配合使用,并为程序员提供不错的选择。但是,可以将C实现设计为特殊目的,例如支持旨在用于long特定大小的旧代码。一般来说,C编译器可以针对其定义的long大小编写指令。
C标准对对象的大小施加了一些较低的限制。字符CHAR_BIT中的位数必须至少为8。 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节中将实现定义为"一组特定的软件,在特定的控制选项下在特定的翻译环境中运行,该软件在以下位置执行程序翻译并支持以下功能的执行:特定的执行环境。"
C实现通常需要符合OS的ABI。
@Barmar:操作系统是实现的一部分。
如果是这样,那么32位OS = 32位C,64位OS = 64位C,对吗?
@Barmar:否。出于实用目的,通用计算机已经完整了。这意味着您可以在任何通用计算机上执行任何计算(不超过硬件的物理范围)。您可以在64位计算机上编写具有16位int的C编译器,并且可以在16位计算机上编写具有64位int的C编译器。 C标准不需要C实现即可提供与操作系统的直接接口。它仅需要标准的库例程,并且可以编写这些例程以执行任何必要的调整以与操作系统一起使用。