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 содержит почти все, что вы хочу знать.