Размер "длинный длинный" в 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 int
32-битный 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 char — 8
short — 16
int — 32
long — 64
long long — 128
intmax_t — 256
(Под "нечисловым" я подразумеваю игнорирование 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 бит.