Что такое хороший способ работы с переменными в 8-битных блоках? - PullRequest
3 голосов
/ 13 декабря 2011

Я играю с моим игрушечным дизайном, и у меня есть несколько проблем. Я хотел бы, чтобы переменные были указаны в битах. Так, например, один объявляет переменные следующим образом:

byte value;
two_bytes value;

Теперь вот моя проблема. Я пытаюсь сделать переводчик для языка в C (или C ++). Насколько я понимаю, C / C ++ состоит в том, что их типы переменных гарантированно будут иметь минимальный размер, но они могут быть больше (т. Е. Символ будет не менее 8 бит, но в некоторых реализациях будет 16-битный символ).

Как я могу написать интерпретатор на C / C ++, который работает только с битами определенной длины? Это единственный способ иметь массив логических значений или установить битовые поля для чего-то вроде типа char?

Ответы [ 5 ]

5 голосов
/ 13 декабря 2011

stdint header - это то, что вам нужно:

#include <cstdint>
std::int32_t x; // 32 bits signed
std::uint16_t y; // 16 bits unsigned
3 голосов
/ 13 декабря 2011

Если я вас правильно понял,

#include <stdint.h>
uint8_t my_byte_var;
int16_t my_signed_2byte_var;

может быть вашим путем ...

3 голосов
/ 13 декабря 2011

Если вы хотите примитивные типы, то большинство компиляторов должны предлагать <stdint.h> (или <cstdint>), который содержит такие типы, как uint8_t, uint16_t, uint32_t.

Если вы хотите неясные размеры (например, uint13_t), вам, вероятно, лучше всего использовать больший стандартный размер. Если вам нужно сэкономить место, вы можете посмотреть на std::bitset, но это, вероятно, будет значительно медленнее для большинства операций.

0 голосов
/ 13 декабря 2011

Если вы не уверены в существующей длине в битах и ​​хотите передать ее в другое значение, чтобы проанализировать ее как таковую, вы можете просто сделать следующее:

char a;
uint8_t b[4];

b = a;

Теперь вы можете получить доступ к компонентамв зависимости от длины, до максимального размера 32 бита, хотя символ никогда не будет 32-битным, я просто использую его для примера.

0 голосов
/ 13 декабря 2011

Обычно вы можете использовать unsigned int для хранения чего-то, скажем, 8 битов, и при этом использовать побитовые операторы, такие как shift (>>). Управление длиной было бы просто некой вставленной логикой. 8 битов могут быть не больше 2 ^ 8 - 1 (255).

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