128位机器中"长长"的大小?

Iva*_*ard 5 c types long-long

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

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

pax*_*blo 8

它们可以是编译器编写者想要的任何大小,只要它们至少与它们的前一类型(long intfor long long intintfor long int)一样大,并且满足标准中规定的最小范围.

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

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
Run Code Online (Sandbox Code Playgroud)

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

如果你真的想知道,你可以在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;
}
Run Code Online (Sandbox Code Playgroud)

在我的系统上,一个相当沼泽标准的(并稍微重新格式化为漂亮):

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
Run Code Online (Sandbox Code Playgroud)

所以看起来,在这个系统上,我有两个的补偿(8/7负/正数的最后一位数字不匹配),无填充位,16位short int,32位intlong int64位long long int.

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

  • 对"long long"的大小有第二个限制:它必须至少为64位.这是由C标准保证的. (2认同)