如何使这些成员元素适合3字节

How to make these member elements fit in 3 bytes?

本文关键字:3字节 元素 成员 何使这      更新时间:2023-10-16

我有一个结构体,它的长度不应该超过14个字节,到目前为止我还有3个字节(11个字节已经被占用)。我需要添加3个成员大小,取值范围为40 ~ 8188Id1,取值范围是1 ~ 257Id2,取值范围为1 ~ 254这里是

uint16_t size:13;
uint16_t id1:9;
uint8_t id2:8;

另一方面,这将导致我多余6位。还有什么方法能让这3个成员在3个字节内?Id1和Id2应该总是在一起

这不可能。

从逻辑上讲,您拥有的可能值的数量是:

  • 8148不同的size s
  • 256个不同的id1 s
  • 253个不同id2 s

这使得8148*256*253 = 527729664个不同的值组合。2的24次方,也就是三个字节的所有可能性,只有16777216。即使你把这三个数字加在一起,你也做不到。

可以按原样装入29位。或者您可以进一步限制值的范围。

如果有关于协方差的额外信息-例如,"当id2为1时,size总是大于500",您可以使用它来压缩更多的内容。

如果结构体的总大小为14字节,则有两种可能:

  • alignof(type) == 2
  • alignof(type) == 4alignof(type) == 8

这取决于前11个字节中声明的成员。它不能对齐到1字节,因为你已经有了一个13位的成员。

在第一种情况下,你找不到解决问题的方法。不仅因为13+9+8 > 3*8所以没有空间(并且没有解决这个问题的方法,请参阅香农的第一个定理)。但也因为如果结构体在2字节边界上对齐,你就不能有一个跨越边界的位域(这是id1的情况,因为3位将驻留在2字节组中,其余的在其他组中)。

如果对齐是4/8字节,没有问题,因为已经有2个字节用于填充(因此结构体的有效大小为16字节),并且您有足够的空闲

是一个选项,做范围切换的情况下的声明?