【问题标题】:Size of "long long" in 128-bit machine?128 位机器中“long long”的大小?
【发布时间】:2015-11-01 21:43:10
【问题描述】:

在 128 位 RISC-V(或其他 128 位机器)中,C/C++ 中的“long”和“long long”数据类型有多大?

澄清一下:在没有其他实现符合的情况下,编译器的实现者在为这样的机器编写limits.h文件时可能期望使用的大小是多少?

【问题讨论】:

    标签: c types long-long


    【解决方案1】:

    它们可以是编译器编写者想要的任何大小,前提是它们至少与其前身类型一样大(long int 对应于long long intint 对应于long int)和满足标准中规定的最小范围。

    例如,参见 C11 中的 5.2.4.2 Numerical limits,其中说明了所需的最小范围:

    long int
        LONG_MIN           -2147483647 // −(2^31 − 1)
        LONG_MAX           +2147483647 //   2^31 − 1
    long long int
        LLONG_MIN -9223372036854775807 // −(2^63 − 1)
        LLONG_MAX +9223372036854775807 //   2^63 − 1
    

    请注意,这些不是您的完整二进制补码范围,因为它们还必须考虑其他两种编码方案,即二进制补码和符号幅度,它们都具有以下概念负零。

    如果你真的想知道,你可以在limits.h头文件中查找这些值,或者编译运行:

    #include <stdio.h>
    #include <limits.h>
    
    int main (void) {
        printf ("BITS/CHAR %d\n", CHAR_BIT);
        printf ("CHARS/SHORT %d\n", sizeof(short));
        printf ("CHARS/INT %d\n", sizeof(int));
        printf ("CHARS/LONG %d\n", sizeof(long));
        printf ("CHARS/LLONG %d\n", sizeof(long long));
        putchar ('\n');
    
        printf ("SHORT MIN %d\n", SHRT_MIN);
        printf ("SHORT MAX %d\n", SHRT_MAX);
        printf ("INT MIN %d\n", INT_MIN);
        printf ("INT MAX %d\n", INT_MAX);
        printf ("LONG MIN %ld\n", LONG_MIN);
        printf ("LONG MAX %ld\n", LONG_MAX);
        printf ("LLONG MIN %lld\n", LLONG_MIN);
        printf ("LLONG MAX %lld\n", LLONG_MAX);
        return 0;
    }
    

    在我的系统上,一个相当标准的系统(并且稍微重新格式化以看起来很漂亮):

    BITS/CHAR      8
    CHARS/SHORT    2
    CHARS/INT      4
    CHARS/LONG     4
    CHARS/LLONG    8
    
    SHORT MIN                 -32768
    SHORT MAX                  32767
    INT MIN              -2147483648
    INT MAX               2147483647
    LONG MIN             -2147483648
    LONG MAX              2147483647
    LLONG MIN   -9223372036854775808
    LLONG MAX    9223372036854775807
    

    所以看起来,在这个系统上,我有二进制补码(负数/正数的最后一位上的 8/7 不匹配),没有填充位,16 位 short int,32 位 intlong int 和64 位long long int

    如果你在自己的环境中运行类似的代码,那应该能够告诉你类似的信息。

    【讨论】:

    • long long 的大小还有第二个约束:它必须至少为 64 位。这是由 C 标准保证的。
    • @cmaster:实际上,“64 位”这个短语在 C11 中只出现了三次,两次与 IEC 60559 浮点格式有关,一次与精确宽度整数类型有关。尽管您可以推断范围(指定了 )以假设需要 64 位,但对于普通整数类型根本没有提及。但它是明确规定的范围,而不是宽度。当然,我可能是错的,这不会是第一次。但我需要引用标准来说服我:-)
    • @paxdiablo:C11 在 §3.5 中将 bit 定义为单位,它大到足以容纳两个值。它还在 §6.5/p5 中提到了术语数学定义。通过纯数学,您可以在n-bit 实体中准确存储2^n 唯一值,long long int最小 范围意味着abs(LLONG_MIN) + LLONG_MAX + 1 唯一值(零加一)。 ceil(log2(abs(LLONG_MIN) + LLONG_MAX + 1)) 的结果是 64,因此它是该类型的 最小 宽度(以位为单位)。请注意,这并不一定意味着 8 个字节,因为 CHAR_BIT 是实现定义的,可以不同于 8 个字节。
    • @Grzegorz,虽然我很欣赏你的努力,但这似乎需要大量的工作(和暗示)来提供一条几乎没有用的信息,尤其是你还需要考虑帐户可能存在任何填充位,进一步“断开”范围与宽度。我想我会坚持使用这些范围,因为它们提供的信息更有用:-)
    【解决方案2】:

    根据标准,命名的非数字有符号整数类型有:

    Type name      Possible size
    signed char    — 8
    short          — 16
    int            — 32
    long           — 64
    long long      — 128
    intmax_t       — 256
    

    (“非数字”是指忽略int_least8_tint_fast16_tint32_t 等)

    列出的大小不是 C 标准规定的大小,但它们是标准级数,每个连续类型中的位数是其两倍。在 128 位机器上,假设long long 的长度为 128 位是合理的。如果编译器编写者想要支持 256 位类型,将intmax_t 变成 256 位类型并不奇怪。但除此之外,你的名字已经用完了。通常,其中一些类型共享相同的大小。

    所有标准要求是列表中前面的类型不长于列表后面的类型,char 至少为 8 位,shortint 至少为 16 位,即long 至少为 32 位,long long 至少为 64 位。

    【讨论】:

    • 你在哪里看到标准中的long long是128bit?我只能发现它至少是64位的。
    • @galinette:标准只说“最低 64 位”。 128 位示例来自假设的 128 位 CPU 类型。
    【解决方案3】:

    包含limits.h 头文件并打印所需类型的大小。

     #include <limits.h>
    
    int main () {
    
    printf ("Size of long long is :  %d\n", sizeof(long long));
    
    return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-05
      • 2019-12-12
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 2013-09-25
      • 2018-12-02
      相关资源
      最近更新 更多