Пользовательский размер байта? - PullRequest
6 голосов
/ 21 апреля 2010

Итак, вы знаете, как примитив типа char имеет размер 1 байт? Как бы я сделал примитив с нестандартным размером? Так что, как вместо int с размером 4 байта, я делаю один с размером, скажем, 16. Есть ли способ сделать это? Есть ли способ обойти это?

Ответы [ 4 ]

5 голосов
/ 21 апреля 2010

Обычно вы просто создаете структуру, которая представляет данные, которые вас интересуют. Если это 16 байтов данных, то это либо совокупность нескольких меньших типов, либо вы работаете на процессоре с собственным 16-байтовым целочисленным типом.

Если вы пытаетесь представить чрезвычайно большие числа, вам может потребоваться найти специальную библиотеку, которая обрабатывает числа произвольного размера.

4 голосов
/ 21 апреля 2010

Это зависит от того, почему вы это делаете.Обычно вы не можете использовать типы менее 8 бит, потому что это адресуемая единица для архитектуры.Однако вы можете использовать структуры для определения различной длины:

struct s {
  unsigned int a : 4;  // a is 4 bits
  unsigned int b : 4;  // b is 4 bits
  unsigned int c : 16; // c is 16 bits
};

Однако нет гарантии, что структура будет иметь длину 24 бита.Кроме того, это может вызвать проблемы с порядком байтов.Там, где это возможно, лучше использовать системные независимые типы, такие как uint16_t и т. Д. Вы также можете использовать побитовые операторы и битовые сдвиги, чтобы очень специфично вертеть вещи.

1 голос
/ 02 июля 2017

В C ++ 11 есть отличное решение для этого: std :: align_storage.

#include <memory>
#include <type_traits>

int main()
{
    typedef typename std::aligned_storage<sizeof(int)>::type memory_type;
    memory_type i;
    reinterpret_cast<int&>(i) = 5;
    std::cout << reinterpret_cast<int&>(i) << std::endl;

    return 0;
}

Позволяет объявить блок неинициализированного хранилища в стеке.

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

Если вы хотите создать новый тип, напечатайте его. Если вы хотите, чтобы он был размером в 16 байтов, напечатайте структуру, в которой есть 16 байтов данных-членов. Просто имейте в виду, что довольно часто компиляторы накладывают на вас вещи в соответствии с потребностями выравнивания ваших систем. Структура из 1 байта редко остается без внимания 1 байтом.

...