2

有人知道在不同机器上比较 C 数据类型大小的网站或论文吗?我对System z等一些“大”机器的价值感兴趣。

并且:是否存在任何机器上最大的本机数据类型可以拥有的字节上限,并且它总是类型complex long double

编辑:我不确定,但 SIMD 寄存器数据是否也利用了 CPU 的缓存?将存储在特殊单元中且不使用 L1/L2/L 缓存的数据类型不符合我的兴趣。只检查类型 {char, short, int, long, long long, float, double, long double, _Bool, void *}(和 _Complex)。

4

4 回答 4

6

C 数据类型大小不依赖于机器平台。这取决于编译器的实现。同一硬件平台上的两个不同编译器可能会以不同的方式实现基本类型,从而导致大小完全不同。

您还应该考虑这样一个事实,即size_t不能保证由用户可访问的类型(如unsigned int. size_t可以通过未知大小和范围的特定于实现的无符号类型来实现是非常合法和可能的。

此外,理论上(和学究式地)C 语言在size方面没有“最大”类型。C 语言规范绝对不保证基本类型的相对大小。C 语言只保证每种类型的可表示值的相对范围。例如,语言保证 的范围int不小于 的范围short。但是,由于 [几乎] 任何类型都可以包含任意数量的填充位,因此理论上 type 的对象大小short可能大于type 的对象大小int。当然,这将是一个非常奇特的情况。

但在实践中,您可以预期这long long int是最大的整数类型,long double也是最大的浮点类型。如果您愿意,您还可以将复杂类型包括在内。

于 2010-02-23T23:10:07.390 回答
0

本机类型的棘手之处在于某些架构和编译器可能会扩展它们。例如,大多数针对现代英特尔硬件的编译器都提供一种__m128数据类型,即 SIMD 寄存器的宽度。AVX 将有 256 位 SIMD 宽度,Larrabee 512 位,并且每个在编译器中都有对应的原生类型。

于 2010-02-23T23:05:06.263 回答
0

x86 机器上的long double类型是 80 位(10 字节),http ://en.wikipedia.org/wiki/Long_double ,尽管现在这或多或少已经过时了。x64 不支持。

于 2010-02-23T23:10:36.357 回答
0

您提到“本机”数据类型,但请注意complexC 规范未定义,因此不是本机类型。C 的本机类型是charintfloatdoublevoid

数据类型的大小通常由底层平台和编译器决定。C 标准定义了这些类型的最小范围并定义了一些相对关系(long int必须至少与常规一样长int,等等)。没有简单的方法来确定任何类型的绝对大小而不对其进行测试。

当使用一个新平台并且我不知道特定的数据类型大小时,我编写了一个简短的应用程序来转储sizeof所有标准 C 类型的结果。也有类似的标头stdint.h为您提供可以信任的数据类型,它们具有一定的大小。

数据类型的大小没有上限。C 标准定义char为“大到足以存储执行字符集的任何成员”。这部分地将本机类型的大小绑定到机器体系结构,因此理论上执行字符最大为 1MB 的机器将sizeof(char)等于 1MB。实际上,您可能找不到适合这种情况的机器。

于 2010-02-23T23:29:50.837 回答