Вопрос
Это связано со следующим вопросом:
Как объявить 32-битное целое число в C
Несколько человек упомянули, что int всегда 32-битный на большинстве платформ.Мне интересно, правда ли это.
Знаете ли вы какие-нибудь современные платформы с int другого размера?Не обращайте внимания на платформы-динозавры с 8-битной или 16-битной архитектурой.
ПРИМЕЧАНИЕ: Я уже знаю, как объявить 32-битное целое число из другого вопроса.Это больше похоже на опрос, призванный выяснить, какие платформы (ЦП/ОС/компилятор) поддерживают целые числа других размеров.
Решение
Как заявили несколько человек, нет никаких гарантий, что «int» будет 32-битным. Если вы хотите использовать переменные определенного размера, особенно при написании кода, который включает манипуляции с битами, вам следует использовать «Стандартные целочисленные типы». по спецификации c99.
int8_t
uint8_t
int32_t
uint32_t
и т. д...
они обычно имеют вид [u]intN_t, где «u» указывает, что вам нужна беззнаковая величина, а N — количество битов.
правильные определения типов для них должны быть доступны в stdint.h на любой платформе, для которой вы компилируете, их использование позволяет вам писать хороший, переносимый код :-)
Другие советы
" является всегда 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
name intN_t
обозначает целочисленный тип со знаком с шириной N
, без битов заполнения и представление дополнения до двух. Таким образом, int8_t
обозначает целочисленный тип со знаком шириной ровно 8 бит. typedef
name uintN_t
обозначает целочисленный тип без знака с шириной N
. Таким образом, uint24_t
обозначает целочисленный тип без знака с шириной ровно 24 бита. typedef код> имена.
В настоящее время большинство настольных и серверных платформ используют 32-разрядные целые числа, и даже многие встроенные платформы (например, карманные ARM или x86) используют 32-разрядные int
. Чтобы добраться до 16-битного int
, вам действительно нужно быть очень маленьким: подумайте " Berkeley mote " или некоторые из более мелких чипсов Atmel Atmega. Но они там.
Нет.Небольшие встроенные системы используют 16-битные целые числа.
Это сильно зависит от вашего компилятора. Некоторые компилируют их как 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;
}
Ну, большинство процессоров на основе ARM могут запускать код Thumb, который является 16-битным режимом. Это включает в себя пока единственные слухи об Android-ноутбуках и новейших смартфонах.
Кроме того, некоторые графические калькуляторы используют 8-битные процессоры, и я бы назвал их довольно современными. Р>
TI все еще продает платы OMAP с ЦСП C55x, которые в основном используются для декодирования видео. Я считаю, что поставляемый компилятор для этого имеет 16-битный Int. Это вряд ли динозавр (Nokia 770 был выпущен в 2005 году), хотя вы можете получить 32-битные DSP.
Большую часть кода, который вы пишете, можно с уверенностью предположить, что он никогда не будет выполняться на DSP. Но, возможно, не все.
Если вас также интересует фактическое максимальное / минимальное значение, а не количество бит, limit.h содержит почти все, что вы хотите знать.