Является Всегда 32-разрядным интервал в C?

Много хороших ответов здесь уже. Но просто хочу упомянуть здесь, что другой ДОЛЖЕН СДЕЛАТЬ, когда использование ожидает (), должен сделать это в цикле, зависящем от условия, Вы ожидаете того, в случае, если Вы видите побочные пробуждения, которые, по моему опыту, происходят.

Для ожидания некоторого другого потока, чтобы изменить условие на истинный и уведомить:

synchronized(o) {
  while(! checkCondition()) {
    o.wait();
  }
}

, Конечно, в эти дни, я рекомендовал бы просто использовать новый объект Условия, поскольку это более ясно и имеет больше функций (как разрешение нескольких условий на блокировку, способность проверить ожидают длина очереди, более гибкое расписание/прерывание, и т.д.).

 Lock lock = new ReentrantLock();
 Condition condition = lock.newCondition();
 lock.lock();
 try {
   while (! checkCondition()) {
     condition.await();
   }
 } finally {
   lock.unlock();
 }

}

20
задан Community 23 May 2017 в 10:31
поделиться

8 ответов

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

int8_t
uint8_t
int32_t
uint32_t

и т. д.

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

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

42
ответ дан 29 November 2019 в 22:38
поделиться

« всегда 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 name intN_t обозначает целочисленный тип со знаком шириной N , без битов заполнения и представление с дополнением до двух. Таким образом, int8_t обозначает целочисленный тип со знаком шириной ровно 8 бит.
  2. typedef name uintN_t обозначает беззнаковый целочисленный тип шириной ] N . Таким образом, uint24_t обозначает беззнаковый целочисленный тип с шириной ровно 24 бита.
  3. Эти типы являются необязательными. Однако, если реализация предоставляет целочисленные типы с шириной 8, 16, 32 или 64 бита, без битов заполнения и (для подписанных типов), которые имеют представление с дополнением до двух, она должна определить соответствующий typedef имена.
17
ответ дан 29 November 2019 в 22:38
поделиться

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

7
ответ дан 29 November 2019 в 22:38
поделиться

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

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

4
ответ дан 29 November 2019 в 22:38
поделиться

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

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

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

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

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

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

1
ответ дан 29 November 2019 в 22:38
поделиться

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

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

1
ответ дан 29 November 2019 в 22:38
поделиться

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

0
ответ дан 29 November 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: