Вопрос

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

Как объявить 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 бита.
  • Эти типы являются необязательными. Однако если реализация предоставляет целочисленные типы с шириной 8, 16, 32 или 64 бита, без битов заполнения и (для типов со знаком), которые имеют представление дополнения до двух, она должна определить соответствующий 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 содержит почти все, что вы хотите знать.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top