2016-01-18 4 views
2

Привет Я хочу объявить 12-битную переменную в C или любую «нетрадиционную» переменную размера (переменная, которая не находится в порядке 2^n). как бы я это сделал. Я везде искал, и ничего не мог найти. Если это невозможно, как бы вы могли сохранить некоторые данные в своей собственной переменной.Как объявить переменные разного размера

+1

Это немного слишком широким. Не могли бы вы указать, чего вы пытаетесь достичь? – Arc676

+0

Один из способов - объявить 16-битную переменную и использовать только самые младшие 12 бит. – immibis

+0

Что вы на самом деле пытаетесь выполнить, какова ваша более глубокая проблема? Это может быть проблема XY. – Olaf

ответ

1

Данные всегда хранятся в группах по байтам (по 8 бит).

В C переменные могут быть объявлены 1 байтом («char» или 8 бит), 2 байта («короткий» int на многих компьютерах - 16 бит) и 4 байта («длинный» int на многие компьютеры - 32 бита).

На более продвинутом уровне вы ищете «битфилды».

Смотреть это возможно: bitfield discussion

+1

1) Байт не обязательно 8 бит. 2) C также не требует октетов. Символ 'char' является одним и тем же байтом s, но - см. 1 3). Целочисленные типы могут включать в себя биты заполнения, поэтому в принципе возможно использование' int' с 17 используемыми битами. Он может содержать или не содержать отступы, это зависит от ширины байта/'char'. – Olaf

+0

О, пожалуйста !!!!!!! –

+0

Если вы прокомментируете мой комментарий, используйте '@', иначе ваш комментарий может пройти незаметно. О тексте: Что вам нравится? Если вы считаете, что я ошибаюсь, предоставьте ссылку на соответствующий раздел в стандарте. – Olaf

3

Используйте битовое:

struct { 
    unsigned int twelve_bits: 12; 
} wrapper; 
4

В отличие от Ada, C не имеет возможности указать типы с ограниченным диапазоном значений. C зависит от предопределенных типов с реализацией определяются характеристиками, но с определенными гарантиями:

  • Типы short и int гарантируется стандартом для хранения по меньшей мере, 16 бит, то вы можете использовать один для хранения ваших 12 битных значений, подписанный или неподписанный.

  • Аналогичным образом, тип long будет содержать не менее 32 бит и тип long long не менее 64 бит. Выберите тип, который достаточно велик для вашей цели.

  • Типы int8_t, int16_t, int32_t, int64_t и их беззнаковые аналоги, определенные в <stdint.h> имеют более точную семантику, но не могут быть доступны на всех системах. Доступны типы int_least8_t, int_least16_t, int_least32_t и int_least64_t, а также аналогичные типы int_fastXX_t, но они не используются очень часто, возможно потому, что имена несколько громоздки.

  • Наконец, вы можете использовать бит-поля для любого количества бит от 1 до 64, но они доступны только как элементы структуры. битовые поля размером 1 должны быть объявлены как unsigned.

+0

Доступны 'intNleast_t' и' intNfast_t' и их неподписанные копии. – Olaf

+0

@Olaf: Я отредактировал ответ для полноты, но эти имена явно не очень дружелюбны. – chqrlie

+0

Согласны с их именами; они слишком длинны. Но все же они существуют. Во всяком случае, для меня неясно, что именно на самом деле OP хочет выполнить и что означает _declare_ здесь. Доступные переменные размеры можно найти очень легко. – Olaf

Смежные вопросы