Определить 16-битное целое число в C

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

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

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

typedef short int16_t

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

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

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

16
задан sara 22 марта '12 в 0:37
источник поделиться
4 ответов

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

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

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

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

33
ответ дан maerics 22 марта '12 в 0:40
источник поделиться

Нет, 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 typedef'ed на int16_t на вашем компьютере просто означает, что short - 16 бит на вашем компьютере. Это не означает, что определение будет таким же на других компьютерах людей (или даже на других компиляторах на вашей же машине).

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

9
ответ дан Adam Rosenfield 22 марта '12 в 0:48
источник поделиться

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

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

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

3
ответ дан Wes Hardaker 22 марта '12 в 0:41
источник поделиться

short гарантируется как минимум 16-bit.

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

2
ответ дан ouah 22 марта '12 в 0:54
источник поделиться

Другие вопросы по меткам