10- или 12-битный тип данных поля в С++

Можно ли определить некоторый тип данных нечетного размера вместо стандартных типов, используя type-def, например 10-битный или 12-битный в С++?


person Hassan Rizwan    schedule 09.04.2015    source источник
comment
Есть несколько альтернатив, которые могут напоминать это, но реальный вопрос заключается в том, каков вариант использования. То есть это похоже на проблему X-Y, у вас есть проблема X, для которой вы считаете Y решением, и вы спрашиваете об Y, не указывая реальную проблему X. Зачем вам типы с нечетным числом битов? Космические ограничения? Гарантировать, что значение находится в пределах диапазона? Любопытство?   -  person David Rodríguez - dribeas    schedule 09.04.2015
comment
Создайте 10-битный тип данных в C/C++   -  person phuclv    schedule 28.05.2016


Ответы (3)


Для этого вы можете использовать битовое поле:

struct bit_field
{
    unsigned x: 10; // 10 bits
};

и использовать его как

bit_field b;
b.x = 15;

Пример:

#include <iostream>

struct bit_field
{
    unsigned x: 10; // 10 bits
};

int main()
{
    bit_field b;
    b.x = 1023;
    std::cout << b.x << std::endl;
    b.x = 1024; // now we overflow our 10 bits
    std::cout << b.x << std::endl;
}

Насколько я знаю, нет возможности иметь битовое поле за пределами struct, т.е.

unsigned x: 10; 

само по себе недействительно.

person vsoftco    schedule 09.04.2015

Вроде как, если вы используете битовые поля. Однако имейте в виду, что битовые поля по-прежнему упакованы внутри некоторого встроенного типа. В приведенном ниже примере как has_foo, так и foo_count «упакованы» внутри целого числа без знака, которое на моей машине использует четыре байта.

#include <stdio.h>

struct data {
  unsigned int has_foo : 1;
  unsigned int foo_count : 7;
};

int main(int argc, char* argv[])
{
  data d;
  d.has_foo = 1;
  d.foo_count = 42;

  printf("d.has_foo = %u\n", d.has_foo);
  printf("d.foo_count = %d\n", d.foo_count);
  printf("sizeof(d) = %lu\n", sizeof(d));

  return 0;
}
person Tom Dial    schedule 09.04.2015
comment
sizeof возвращает size_t, который должен быть напечатан с использованием %zu - person phuclv; 07.08.2018

Используйте для этого битовые поля. Думаю, это должно помочь http://www.cs.cf.ac.uk/Dave/C/node13.html#SECTION001320000000000000000

person Guru    schedule 09.04.2015