Много хороших ответов здесь уже. Но просто хочу упомянуть здесь, что другой ДОЛЖЕН СДЕЛАТЬ, когда использование ожидает (), должен сделать это в цикле, зависящем от условия, Вы ожидаете того, в случае, если Вы видите побочные пробуждения, которые, по моему опыту, происходят.
Для ожидания некоторого другого потока, чтобы изменить условие на истинный и уведомить:
synchronized(o) {
while(! checkCondition()) {
o.wait();
}
}
, Конечно, в эти дни, я рекомендовал бы просто использовать новый объект Условия, поскольку это более ясно и имеет больше функций (как разрешение нескольких условий на блокировку, способность проверить ожидают длина очереди, более гибкое расписание/прерывание, и т.д.).
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
lock.lock();
try {
while (! checkCondition()) {
condition.await();
}
} finally {
lock.unlock();
}
}
Как заявили несколько человек, нет никаких гарантий, что 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
s. Чтобы получить 16-битный int
, вам нужно действительно стать очень маленьким: подумайте о «частицах Беркли» или о некоторых более мелких чипах Atmel Atmega. Но они там есть.
Это во многом зависит от вашего компилятора. Некоторые компилируют их как 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;
}
Нет. Небольшие встроенные системы используют 16-битные целые числа.
Ну, большинство ARM- Процессоры на базе могут запускать Thumb-код в 16-битном режиме. Сюда входят ноутбуки с Android, о которых пока только ходят слухи, и новейшие смартфоны.
Кроме того, некоторые графические калькуляторы используют 8-битные процессоры, и я бы назвал их довольно современными.
большинство процессоров на базе ARM могут выполнять код Thumb, который является 16-битным режимом. Сюда входят ноутбуки с Android, о которых пока только ходят слухи, и новейшие смартфоны.Кроме того, в некоторых графических калькуляторах используются 8-битные процессоры, и я бы назвал их довольно современными.
Большинство процессоров на базе ARM могут выполнять код Thumb, который является 16-битным режимом. Сюда входят ноутбуки с Android, о которых пока только ходят слухи, и новейшие смартфоны.Кроме того, в некоторых графических калькуляторах используются 8-битные процессоры, и я бы назвал их довольно современными.
TI are до сих пор продают платы OMAP с DSP C55x, в основном используемые для декодирования видео. Я считаю, что поставляемый компилятор для этого имеет 16-битное int. Вряд ли это динозавр (Nokia 770 был выпущен в 2005 году), хотя вы можете получить 32-битные DSP.
Большая часть кода, который вы пишете, вы можете с уверенностью предположить, что он никогда не будет запущен на DSP. Но, возможно, не все.
Если вас также интересует фактическое максимальное / минимальное значение вместо количества битов, limits.h содержит почти все, что вы хотите знать.