dan*_*n04 12
它依赖于实现.C标准只要求:
char
至少有8位short
至少有16位int
至少有16位long
至少有32位long long
至少有64位(1999年增加)在16/32位日,事实上的标准是:
int
是"原生"整数大小但是,64位系统通常不会产生int
64位,这会产生三种64位类型而不是32位类型的尴尬局面. 一些编译器扩展long
到64位.
它主要取决于编译器.例如,如果你有一个64位的x86处理器,你可以使用一个旧的16位编译器并获得16位整数,一个32位编译器并获得32位整数,或一个64位编译器并得到64 -bit整数.
它取决于处理器到编译器针对特定处理器的程度,并且(例如)古老的16位处理器根本不会运行针对闪亮的新64位处理器的代码.
C和C++标准确实保证了一些最小大小(通过指定最小支持范围间接):
char: 8 bits
short: 16 bits
long: 32 bits
long long: 64 bits
Run Code Online (Sandbox Code Playgroud)
还保证大小/范围严格按照以下顺序不减少:char,short,int,long和long long 1.
在C99和C++ 0x中指定了1 long long,但是一些编译器(例如,gcc,Intel,Comeau)也允许在C++ 03代码中使用它.如果你愿意,你可以说服大多数(如果不是全部)long long
在C++ 03代码中拒绝.
形式上,所有基本数据类型(包括其大小)的表示都依赖于编译器,并且仅依赖于编译器.编译器(或者更确切地说,实现)可以充当程序和机器之间的抽象层,完全隐藏机器或者以任何方式扭曲程序.
但实际上,编译器旨在为给定的机器和/或操作系统生成最有效的代码.为了实现这一点,基本数据类型应该具有给定机器和/或OS的自然表示.从这个意义上讲,这些表示间接依赖于机器和/或OS.
换句话说,从抽象的,形式的和迂腐的角度来看,编译器可以完全忽略特定于机器的数据类型表示.但这没有实际意义.在实践中,编译器充分利用机器提供的数据类型表示.
但是,如果机器不支持某些数据类型,编译器仍然可以通过在编译器级别实现其支持("模拟"它)来向程序提供该数据类型.例如,对于32位计算机,32位编译器通常可以使用64位整数类型,即使它们不受机器直接支持.在当天,编译器通常会为没有配备浮点协处理器的机器提供浮点类型的编译器级支持(因此不直接支持浮点类型).