2015-08-10 1 views
5

В 128-разрядной RISC-V (или другой 128-разрядной машине), насколько велики «длинные» и «длинные» типы данных в C/C++?Размер "long long" в 128-bit machine?

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

ответ

8

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

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

+2

Существует второе ограничение размера 'long long': оно должно быть не менее 64 бит. Это гарантируется стандартом C. – cmaster

+1

@cmaster: на самом деле фраза «64 бита» видна только трижды в C11, дважды по отношению к формату с плавающей запятой IEC 60559 и один раз для целых чисел точной ширины. Он не упоминается вообще для обычных целых типов, хотя вы можете экстраполировать диапазоны (которые * указаны *), чтобы предположить, что требуется 64 бита. Но это * диапазоны *, которые указаны конкретно, а не ширина. Конечно, я могу ошибаться, это было бы не в первый раз. Но мне понадобится ссылка на стандарт, чтобы убедить меня :-) – paxdiablo

+1

@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' определяется реализацией и может отличаться от восьми. –

-1

Согласно стандарту, названные нецифровых подписанные целые типы являются:

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 бит.

+1

Где вы видели, что длинный длинный 128 бит в стандарте? Я могу только найти, что он не менее 64 бит. – galinette

+0

@ galinette: стандарт говорит только «минимум 64 бит». Пример с 128-битным кодом исходит из гипотетического 128-битного типа ЦП. –

0

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

#include <limits.h> 

int main() { 

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

return 0; 
}