Размер "длинный длинный" в 128-битной машине?

В 128-битном RISC-V (или другом 128-битном компьютере) насколько велики типы данных long и long long в C/C++?

Чтобы уточнить: каковы размеры, которые, как ожидается, может использовать разработчик компилятора при написании файла limit.h для такой машины, если другие реализации не будут соответствовать?

3 ответа

Они могут быть любого размера, который хотел создатель компилятора, при условии, что они по крайней мере столь же велики, как их предшественник (long int за long long int а также int за 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 бит short int32-битный int а также long int и 64-битный long long int,

Если вы запускаете подобный код в своей собственной среде, он сможет сообщить вам подобную информацию.

Включите заголовок limit.h и напечатайте размер нужного типа.

 #include <limits.h>

int main () {

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

return 0;
}

В соответствии со стандартом, именованные целочисленные типы не числовых со знаком:

Type name      Possible size
signed char8
short16
int32
long64
long long128
intmax_t256

(Под "нечисловым" я подразумеваю игнорирование int_least8_t, int_fast16_t а также int32_t, так далее.)

Указанные размеры не соответствуют стандарту C, но представляют собой стандартную последовательность с удвоенным числом битов в каждом последующем типе. На 128-битной машине было бы разумно предположить, что long long будет длиной 128 бит. Если бы писатель компилятора хотел поддерживать 256-битные типы, было бы нелепо intmax_t в 256-битный тип. Но кроме этого, у вас закончились имена. Обычно некоторые из этих типов имеют одинаковые размеры.

Все, что требуется по стандарту, - это отсутствие типа "ранее" в списке, а не "более поздний" тип в списке, что char по крайней мере 8 бит, что short а также int не менее 16 бит, что long не менее 32 бит, и это long long составляет не менее 64 бит.

Другие вопросы по тегам