Они могут быть любой размер писатель компилятор хочет, при условии их, по меньшей мере, как большой, как их тип предшественника (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
.
Если вы используете аналогичный код в своей собственной среде, это должно быть в состоянии рассказать вам о подобной информации.
Существует второе ограничение размера 'long long': оно должно быть не менее 64 бит. Это гарантируется стандартом C. – cmaster
@cmaster: на самом деле фраза «64 бита» видна только трижды в C11, дважды по отношению к формату с плавающей запятой IEC 60559 и один раз для целых чисел точной ширины. Он не упоминается вообще для обычных целых типов, хотя вы можете экстраполировать диапазоны (которые * указаны *), чтобы предположить, что требуется 64 бита. Но это * диапазоны *, которые указаны конкретно, а не ширина. Конечно, я могу ошибаться, это было бы не в первый раз. Но мне понадобится ссылка на стандарт, чтобы убедить меня :-) – paxdiablo
@paxdiablo: C11 определяет _bit_ в §3.5 как единицу, достаточно большую, чтобы удерживать два значения. В нем также упоминается термин «математически определенный» в § 6.5/р5. По чистой математике вы можете хранить уникальные значения '2^n' в' n'-бит сущности, диапазон 'minimum_ 'long long int подразумевает уникальные значения abs (LLONG_MIN) + LLONG_MAX + 1' (дополнительный для нуля). Результат 'ceil (log2 (abs (LLONG_MIN) + LLONG_MAX + 1))' равен 64, поэтому для этого типа это ширина _minimum_ в битах. Обратите внимание, что это не neccesiraly подразумевает восемь байтов, так как 'CHAR_BIT' определяется реализацией и может отличаться от восьми. –