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