我需要在一个结构中使用一个 6 字节(48 位)位域,我可以将其用作无符号整数进行比较等。如下所示:
pack (1)
struct my_struct {
_int64 var1:48;
} s;
if (s.var >= 0xaabbccddee) { // do something }
但不知何故,在 64 位 Windows 上,sizeof
这个结构总是返回 8 个字节而不是 6 个字节。任何指针表示赞赏?
我需要在一个结构中使用一个 6 字节(48 位)位域,我可以将其用作无符号整数进行比较等。如下所示:
pack (1)
struct my_struct {
_int64 var1:48;
} s;
if (s.var >= 0xaabbccddee) { // do something }
但不知何故,在 64 位 Windows 上,sizeof
这个结构总是返回 8 个字节而不是 6 个字节。任何指针表示赞赏?
您已经使用_int64
并因此sizeof
返回 8。就像您决定使用可用的 64 位中的 48 位一样。即使我们声明这样的东西——
struct my_struct {
_int64 var1:1;
} s;
仍然sizeof
会说 8。简而言之,位域的分配将根据位域的类型进行。在这种情况下,它_int64
因此分配了 8 个字节。
不幸的是,位字段具有底层类型的大小,在这种情况下 _int64 是 8 个字节。
由于我所知道的任何编译器中都没有六字节整数,因此您必须找到更好的方法。一种是使用一个 16 和一个 32 位值(或三个 16 位值)并编写自己的比较函数。
例如:
struct my_struct
{
uint16_t high;
uint32_t low
} s;
if ( (s.high > 0xaa)
|| ( (s.high == 0xaa)
&& (s.low >= 0xbbccddee)))
{ ... do something ... }
作为奖励,您不需要#pragma pack
,这会带来很多其他问题。
我做了一些谷歌搜索。发现您可能可以使用__attribute__((packed))
.
http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Type-Attributes.html
24 typedef struct __uint48_t uint48_t;
25 struct __attribute__((packed)) __uint48_t {
26 uint64_t _m:48;
27 };
29 void test()
30 {
31 uint48_t a;
32 a._m = 281474976710655;
33 printf("%llu", a._m);
34 printf("%u", sizeof(a));
35
36 a._m = 281474976710656;
37 printf("%llu", a._m);
38 }
main1.c: In function ‘test’:
main1.c:36:2: warning: large integer implicitly truncated to unsigned type [-Woverflow]
$ ./a.out
281474976710655
6
0
但是,正如您所说,您使用的是 Windows,这可能会有所不同。
我可能是错的,如果是这样,请指出。
顺便说一句,我仍然不知道这个问题的最佳解决方案是什么。使用 struct 会让事情变得有点尴尬(你需要 calla._m
而不是a
,我们可以绕过它吗?)但至少它看起来比只使用uint64_t
.