Как убедиться, что значение int равно 4 или 2 байта в C / C ++ - PullRequest
10 голосов
/ 16 апреля 2010

Я хочу знать, как объявить int, чтобы быть уверенным, что он равен 4 байта или короток в 2 байта, независимо от того, на какой платформе. Есть ли в С99 правила по этому поводу?

Ответы [ 8 ]

19 голосов
/ 16 апреля 2010

C99 ничего не говорит об этом, но вы можете проверить, есть ли sizeof(int) == 4, или вы можете использовать типы фиксированного размера, такие как uint32_t (32-битное целое число без знака). Они определены в stdint.h

8 голосов
/ 16 апреля 2010

Если вы используете C99 и вам нужны целочисленные типы заданного размера, включите stdint.h. Он определяет такие типы, как uint32_t для целого числа без знака, равного 32 битам, и uint_fast32_t для целого числа без знака, по крайней мере, 32 бита и «быстрый» на целевой машине по определению fast.

Редактировать: Помните, что вы также можете использовать битовые поля для получения определенного количества битов (хотя это может не дать наилучшую производительность, особенно при «странных» размерах, и большинство аспектов определяются реализацией):

typedef struct {
    unsigned four_bytes:32;
    unsigned two_bytes:16;
    unsigned three_bits:3;
    unsigned five_bits:5;
} my_message_t;

Редактировать 2: также помните, что sizeof возвращает число char с. Теоретически возможно (хотя очень маловероятно в наши дни), что char не является 8 битами; количество битов в char определяется как CHAR_BIT в limits.h.

0 голосов
/ 17 апреля 2010

Вчера вечером я обнаружил, что Visual Studio 2008 не поддерживает C99, и он не поддерживает stdint.h. НО у них есть свои типы. Вот пример:

#ifdef _MSC_VER 
typedef __int8  int8_t;
typedef unsigned __int8 uint8_t;
typedef __int16 int16_t;
typedef unsigned __int16 uint16_t;
typedef __int32 int32_t; 
typedef unsigned __int32 uint32_t; 
typedef __int64 int64_t; 
typedef unsigned __int64 uint64_t; 
#else 
#include <stdint.h> 
#endif 
0 голосов
/ 16 апреля 2010

Вы можете использовать sizeof (int), но вы никогда не сможете предположить, насколько велика int. Спецификация C не делает никаких предположений относительно размера типа int, за исключением того, что он должен быть больше или равен размеру short (который должен быть больше или равен размеру символа).

Часто размер типа int совпадает с базовым оборудованием. Это означает, что int обычно совпадает со словом, где слово - это функциональный размер данных, извлекаемых из шины памяти (или иногда ширины регистра ЦП). Это не обязательно должно быть то же самое, что и слово, но в самых первых примечаниях, которые я указал, это должен быть предпочтительный размер для передачи памяти (обычно это слово).

В прошлом были 18-битные (PDP-8) и 24-битные (PDP-15). Были архитектуры с 36-битным размером слова (PDP-11), но я не могу вспомнить, какой у них оказался размер int.

На платформах Linux вы можете заглянуть в

#include <sys/types.h>

чтобы получить фактическое количество бит для каждого типа.

0 голосов
/ 16 апреля 2010

Полагаю, вы хотите чего-то большего, чем просто очевидная проверка sizeof (int) == 4. Скорее всего, вам нужна проверка во время компиляции.

В C ++ вы можете использовать BOOST_STATIC_ASSERT.

В C вы можете сделать утверждения во время компиляции, написав код, который пытается создать массивы отрицательного размера при сбое или пытается создать операторы switch с переопределенными случаями. См. Этот вопрос о стеке потока для примеров: Способы ASSERT выражений во время сборки в C

0 голосов
/ 16 апреля 2010

sizeof (int) вернет количество байтов, которое int занимает в памяти в текущей системе.

0 голосов
/ 16 апреля 2010

Вы хотите, чтобы он был 4 байта?

Если вы просто хотите увидеть размер int, скомпилированного на каждой платформе, вы можете просто сделать sizeof(int).

0 голосов
/ 16 апреля 2010

Попробуйте константу INT_MAX в пределах. Ч

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...