Всегда ли int в C 32-битный? - PullRequest
       18

Всегда ли int в C 32-битный?

20 голосов
/ 05 августа 2009

Это связано со следующим вопросом,

Как объявить 32-разрядное целое число в C

Некоторые люди упоминали, что int всегда 32-битный на большинстве платформ. Мне любопытно, если это правда.

Знаете ли вы какие-либо современные платформы с int другого размера? Игнорируйте платформы динозавров с 8-битной или 16-битной архитектурой.

ПРИМЕЧАНИЕ: Я уже знаю, как объявить 32-разрядное целое число из другого вопроса. Этот больше похож на опрос, чтобы выяснить, какие платформы (ЦП / ОС / компилятор) поддерживают целые числа с другими размерами.

Ответы [ 8 ]

41 голосов
/ 05 августа 2009

Как заявили несколько человек, нет никаких гарантий, что int будет 32-битным, если вы хотите использовать переменные определенного размера, особенно при написании кода, который включает битовые манипуляции, вы должны использовать 'Standard Integer Типы, предписанные спецификацией c99.

int8_t
uint8_t
int32_t
uint32_t

и т.д ...

они обычно имеют форму [u] intN_t, где 'u' указывает, что вы хотите количество без знака, а N - это количество бит

правильные typedefs для них должны быть доступны в stdint.h на любой платформе, для которой вы компилируете, их использование позволяет вам написать красивый, переносимый код: -)

17 голосов
/ 05 августа 2009

"равно всегда 32-бит на большинстве платформ" - что не так с этим фрагментом? : -)

Стандарт C не предписывает размеры многих своих целочисленных типов. Он делает обязательными относительные размеры, например, sizeof(int) >= sizeof(short) и так далее. Он также предписывает минимальные диапазоны, но допускает множественные схемы кодирования (два дополнения, одно дополнение и знак / величина).

Если вам нужна переменная определенного размера, вам нужно использовать переменную, подходящую для платформы, на которой вы работаете, например, использование #ifdef, что-то вроде:

#ifdef LONG_IS_32BITS
    typedef long int32;
#else
    #ifdef INT_IS_32BITS
        typedef int int32;
    #else
        #error No 32-bit data type available
    #endif
#endif

В качестве альтернативы, C99 и выше допускают точные целочисленные типы ширины intN_t и uintN_t:


  1. Имя typedef intN_t обозначает целочисленный тип со знаком со шириной N, без битов заполнения и представление дополнения до двух. Таким образом, int8_t обозначает целочисленный тип со знаком шириной ровно 8 бит.
  2. typedef имя uintN_t обозначает целочисленный тип без знака с шириной N. Таким образом, uint24_t обозначает целочисленный тип без знака с шириной ровно 24 бита.
  3. Эти типы являются необязательными. Однако если реализация предоставляет целочисленные типы с шириной 8, 16, 32 или 64 бита, без битов заполнения и (для типов со знаком), которые имеют представление дополнения до двух, она должна определить соответствующие typedef имена.
6 голосов
/ 05 августа 2009

В настоящее время большинство настольных и серверных платформ используют 32-разрядные целые числа, и даже многие встроенные платформы (например, карманные ARM или x86) используют 32-разрядные int с. Чтобы получить 16-битный int, вам действительно нужно быть очень маленьким: подумайте «Беркли-моте» или некоторые из более мелких чипов Atmel Atmega. Но они там.

3 голосов
/ 05 августа 2009

Нет. Небольшие встроенные системы используют 16-битные целые числа.

2 голосов
/ 05 августа 2009

Это сильно зависит от вашего компилятора. Некоторые компилируют их как 64-битные на 64-битных машинах, некоторые компилируют их как 32-битные. Встроенные системы представляют собой собственный маленький специальный шарик воска.

Лучшее, что вы можете сделать, чтобы проверить:

printf("%d\n", sizeof(int));

Обратите внимание, что sizeof будет распечатывать байты. Сделайте sizeof(int)*CHAR_BIT, чтобы получить биты.

Код для печати количества бит для различных типов:

#include <limits.h>
#include <stdio.h>

int main(void) {
    printf("short is %d bits\n",     CHAR_BIT * sizeof( short )   );
    printf("int is %d bits\n",       CHAR_BIT * sizeof( int  )    );
    printf("long is %d bits\n",      CHAR_BIT * sizeof( long )    );
    printf("long long is %d bits\n", CHAR_BIT * sizeof(long long) );
    return 0;
}
1 голос
/ 05 августа 2009

TI все еще продает платы OMAP с DSP C55x на них, в основном используемые для декодирования видео. Я считаю, что поставляемый компилятор для этого имеет 16-битный Int. Это вряд ли динозавр (Nokia 770 был выпущен в 2005 году), хотя вы можете получить 32-битные DSP.

Большую часть кода, который вы пишете, вы можете смело предположить, что он никогда не будет выполняться на DSP. Но, возможно, не все.

1 голос
/ 05 августа 2009

Что ж, большинство процессоров на основе ARM могут выполнять код Thumb, который является 16-битным режимом. Это включает в себя все еще единственные слухи об Android-ноутбуках и новейших смартфонах.

Кроме того, некоторые графические калькуляторы используют 8-битные процессоры, и я бы назвал их довольно современными.

0 голосов
/ 05 августа 2009

Если вас также интересует фактическое максимальное / минимальное значение вместо количества битов, limit.h содержит практически все, что вы хотите знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...