Is int in C Всегда 32-бит?

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

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

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

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

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

Ответ 1

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

int8_t
uint8_t
int32_t
uint32_t

и т.д...

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

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

Ответ 2

"всегда 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:


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

Ответ 3

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

Ответ 4

Это сильно зависит от вашего компилятора. Некоторые компилируют их как 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;
}

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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