Определить 16-битное целое число в C - PullRequest
17 голосов
/ 22 марта 2012

Мне нужно объявить целое число размером 16 бит в C.

Я знаю, что размеры short и int зависят от машины.

Я пытался использовать "stdint.h",, но кажется, что они просто

typedef short int16_t

Итак, мой вопрос:

Я что-то упустил, и короткий тип гарантирует 16-битную длину?

Если нет, есть ли альтернатива, гарантирующая это?

Ответы [ 4 ]

33 голосов
/ 22 марта 2012

Это означает, что int16_t определяется как short на вашей машине, а не на всех машинах.

Просто используйте int16_t, где вам абсолютно необходим 16-битный целочисленный тип; он будет определен соответствующим образом на всех платформах, которые предоставляют stdint.h (что должно быть всем, что поддерживает C99, или cstdint для C ++).

[Edit] Для пояснения, файл заголовка "stdint.h" предоставляется компилятором C (или C ++), поэтому его содержимое, вероятно, будет различаться в зависимости от компилятора, версии, системы, архитектуры ЦП, и т. д. То есть авторы пакета компилятора точно знают, какие типы имеют размеры и на каких системах. Глядя на этот файл только в одной системе, вы узнаете только об определениях для конкретной версии конкретного компилятора в конкретной ОС на конкретной архитектуре (например, GCC 4.2 на Darwin x86_64, Visual Studio на WinNT Alpha или ICC на Solaris IA32 , так далее). Некоторые системы, особенно встроенные, могут иметь разные размеры шрифта, поэтому short не всегда может быть 16-битным, и компилятор будет знать правильный размер для использования для этой длины в битах.

Если вы посмотрите на файл stdint.h в другой системе, определения могут отличаться или они могут быть одинаковыми - но его цель - предоставить определения для целочисленных типов гарантированных битовых длин.

9 голосов
/ 22 марта 2012

Нет, short не не гарантирует 16-битную длину. Единственные гарантии относительно основных целочисленных типов данных:

  • sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
  • sizeof(char) == 1 (примечание: a char может быть больше 8 бит!)
  • SHRT_MIN <= -32767 и SHRT_MAX >= 32767 (подразумевается, что short не менее 16 бит)
  • INT_MIN <= -32767 и INT_MAX >= 32767 (подразумевается, что int не менее 16 бит)
  • LONG_MIN <= -2147483647 и LONG_MAX >= 2147483647 (подразумевается, что long не менее 32 бит)
  • LLONG_MIN <= -9223372036854775807 и LLONG_MAX >= 9223372036854775807 (подразумевается, что long long не менее 64 бит)

(C99 §5.2.4.2.1 и Приложение E)

Тот факт, что short определен на int16_t на вашей машине, означает, что short равен 16 битам на вашей машине. Это не означает, что определение будет таким же на машинах других людей (или даже на других компиляциях на той же машине).

Если вы включите <stdint.h>, он каким-то образом определит int16_t, который гарантированно будет типом со знаком и шириной 16 бит. Если вам нужны целые числа точного размера, используйте эти типы точного размера.

3 голосов
/ 22 марта 2012

Каждая машина может иметь или не иметь эти определения.

Единственный настоящий безопасный способ сделать это - через проверку конфигурации или что-то в этом роде.

Но еслиint16_t существует (и configure находит его), тогда это должно быть короткое замыкание на машинах, где короткое замыкание действительно составляет 16 бит.Если у short другой размер, то эта система будет определять int16_t как-то для вас.То есть, если доступно int16_t, вы можете смело предположить, что его длина составляет 2 байта.

2 голосов
/ 22 марта 2012

short гарантированно будет иметь ширину не менее 16-bit.

Может иметь ширину 16-bit в вашей системе, но 32-bit в другой системе.

...