5

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

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

4

3 回答 3

8

它们可以是编译器编写者想要的任何大小,前提是它们至少与其前身类型(long intforlong 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

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

如果你真的想知道,你可以在头文件中查找这些值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-bit short int, 32-bitintlong int64-bit long long int

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

于 2015-08-10T04:40:22.103 回答
0

包括 limits.h 标头并打印所需类型的大小。

 #include <limits.h>

int main () {

printf ("Size of long long is :  %d\n", sizeof(long long));

return 0;
}
于 2015-08-10T09:41:51.423 回答
-2

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

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

(通过“非数字”,我的意思是忽略int_least8_t,int_fast16_tint32_t等)

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

所有标准要求是列表中较早的类型不长于列表中较晚的类型,即char至少 8 位,short至少int16 位,即long至少 32 位,并且long long至少 64位。

于 2015-08-10T05:10:36.240 回答