【问题标题】:Size of C data types on different machines & sizeof(complex long double)不同机器上 C 数据类型的大小 & sizeof(complex long double)
【发布时间】:2011-01-20 07:33:11
【问题描述】:

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

并且: 任何机器上最大的本机数据类型是否存在字节上限?是否总是complex long double类型?

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

【问题讨论】:

  • 对于C源代码的一些静态分析。
  • 知道最大数据类型的最大可能大小的目的是什么?如果您只想检查整数溢出,可以使用INT_MAX 中定义的其他常量。

标签: c comparison types sizeof


【解决方案1】:

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

您还应该考虑这样一个事实:size_t 等标准类型不能保证由unsigned int 等用户可访问类型表示。 size_t 可以通过未知大小和范围的特定于实现的无符号类型来实现,这是完全合法的。

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

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

【讨论】:

  • Pedant: char
  • @Joel:不正确。 C 语言标准完全没有说明类型的相对 sizes。仅关于范围。相对 大小 是由 C++ 标准规定的,而不是由 C 标准规定的。
  • 我不确定size_t 的类型可能是用户不可访问的意思。如果不出意外,用户必须能够声明size_t 类型的变量,而size_t x = sizeof(size_t); 必须在x 中添加一些有意义的内容。
  • @Michael Burr:我的意思是该类型可能是特定于实现的非标准类型,例如某些_szt_128_int_t。当然,它可能是“用户可访问的”,但不是直接“可用”,因为它本身不可移植。
【解决方案2】:

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

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

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

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

【讨论】:

  • complex 由 C 标准的 §7.3(复数算术 <complex.h>)定义。
  • @Matthew - 即 C99 标准。标准 ANSI C 没有定义“复杂”,但它有时可用作特定于编译器的扩展。
  • ANSI C 的最新版本是 C99。它在十多年前(2000 年 5 月)由 ANSI 标准化。如果你指的是 C89,就说 C89。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • “Machines”对 C 的 long double 一无所知。没有什么能阻止 C 实现将long double 实现为 8 字节 FP 类型。
    • @AntryT:问题不在于 C 标准,而在于实现的变化。一些 x86 编译器支持 80 位类型
    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 2018-12-06
    • 2013-09-25
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多