在c ++中定义可容纳六个值的最小可能数据类型

Miz*_*zor 2 c++ memory binary hex memory-management

我想定义自己的数据类型,它可以包含六个可能值中的一个,以便了解有关c ++内存管理的更多信息.在数字中,我希望能够保持0到5.二进制,只需要三位(101 = 5)即可,但有些(6和7)不会被使用.数据类型也应尽可能少地占用内存.

我不知道如何做到这一点.首先,我尝试了一个枚举,其中包含所有字段的已定义值.据我所知,这里的值是十六进制的,所以一个"hexbit"应该允许我存储0到15.但是将它与char(与sizeof)进行比较,它表示它是char的4倍大小,并且如果我没有误解,则char保持0到255.

#include <iostream>

enum Foo
{
    a = 0x0, 
    b = 0x1,
    c = 0x2,
    d = 0x3,
    e = 0x4,
    f = 0x5,
};

int main()
{
    Foo myfoo = a;
    char mychar = 'a';

    std::cout << sizeof(myfoo); // prints 4
    std::cout << sizeof(mychar); // prints 1

    return 1;
}
Run Code Online (Sandbox Code Playgroud)

我明显误解了一些事情,但没有看到什么,所以我转向了SO.:)

另外,在写这篇文章时,我意识到我显然缺少词汇的某些部分.我把这篇文章作为一个社区维基,请编辑它,这样我就可以学到正确的单词.

Aln*_*tak 7

A char是最小的类型.

如果您碰巧知道在一个地方需要几个这样的3位值,那么您将使用具有位域语法的结构:

struct foo {
  unsigned int val1:3;
  unsigned int val2:3;
};
Run Code Online (Sandbox Code Playgroud)

因此在一个字节内得到2个.从理论上讲,您可以将10个这样的字段打包成32位"int"值.

  • 呃,位域的可移植性不亚于 int test = 1234567; 这只适用于类似的硬件(相同的整数大小,相同的字节序)。 (2认同)