我需要在C语言中存储0-15之间的值,只需4位即可。我该如何创建一个只有4位的变量呢?由于空间有限制,请帮我优化一下。
char
。是的,它只有8位,但您可以使用位移运算符(<<
和>>
)将值存储在其余4位中。
编辑:根据下面的评论,unsigned char
实际上比char
更可取,以避免签名位问题。你可以使用位域来存储你的4位数据,但是,除非你在一个结构体中有多个相邻的位域,否则与将值存储在字节中相比,你不会节省任何空间。
unsigned char
,那么您可以简单地使用索引的低位比特作为移位操作数,例如 (i&1)<<2
。 - R.. GitHub STOP HELPING ICE你不能真正拥有一个4位变量,但是你可以拥有存储两个4位值的8位变量,但是你必须使用一个临时变量来访问它们,这意味着除非你有超过两个变量,否则你不会节省任何空间:
uint8_t var_both;
uint8_t temp = (var_both >> 4) & 0x0F; // For first value
temp = var_both & 0x0F; // For second value
unsigned char myOneBitVariable:1;
对于您的情况是'unsigned char MyFourBitVariable:4'。我想指出这是非常困难的,并且为什么您应该避免它。__attribute__((aligned(x)))
,在MSVC上则是__declspec(align(x))
。在大多数情况下,您还需要指定编译器应该打包结构的大小。MSVC有#pragma pack(x)
指令:http://msdn.microsoft.com/en-us/library/2e70t5y1(VS.80).aspx。您也可以阅读有关MSVC对齐的信息:http://msdn.microsoft.com/en-us/library/83ythb65(VS.80).aspx。GCC有自己的实现,称为__attribute__ ((__packed__)
,您可能需要搜索一下。
#ifndef _MSC_VER
#error This alignment solution / packing solution is only valid on MSC
#endif /* ifndef _MSC_VER */
#define M_ALIGN(x) __declspec(align(x))
struct S64Bits
{
unsigned char MyOneBitVariable:1;
int My32BitInt;
};
// MSVC specific implementation of data-packing in a type.
#pragma pack(1)
struct S32Bits
{
D_ALIGN(1) int My16BitVariable:16;
D_ALIGN(1) unsigned char Padding8Bits;
D_ALIGN(1) unsigned char MyOneBitVariable1:1;
D_ALIGN(1) unsigned char MyOneBitVariable2:1;
D_ALIGN(1) unsigned char MyOneBitVariable3:1;
D_ALIGN(1) unsigned char MyOneBitVariable4:1;
D_ALIGN(1) unsigned char MyFourBitVariable:4;
};
#pragma pack(pop)
'sizeof(S64Bits)'应该为8,确实如此。'sizeof(S32Bits)'应该是4,但事实并非如此。在MSVC上,后者是6个字节。这种行为还与编译器有关,并且通常具有编译器唯一的指令。这种行为几乎从不会给你想要的结果。我经常使用宏来确保我需要的结构确实是某个特定大小:
#define TEST_TYPE_SIZE(Type, Size) assert(sizeof(Type) == Size);
struct two_nibbles {
unsigned a :4;
unsigned b :4;
}
你必须将两个变量命名为x.a
和x.b
(但将x
更改为任何名称),这样可以节省一些空间。不过,你可能需要检查一下 - 我认为编译器会确保sizeof(struct two_nibbles) == sizeof(char)
,但也可能不会,因此你可能需要添加更多的nibbles以使其占用更多空间。
你是否会想要获取这些4位值的地址?如果是,你需要将它们存储在“适当”的数据类型中,例如char。
char
中。但是,你应该确保使用unsigned char
,否则在进行有符号移位时会出现奇怪的行为。 - Chris Lutz