我需要在一个结构中使用一个6字节(48位)位字段,我可以将其用作无符号整数进行比较等等。
pack (1)
struct my_struct {
_int64 var1:48;
} s;
if (s.var >= 0xaabbccddee) { // do something }
但不知何故,在Windows 64上,此结构的sizeof总是返回8个字节而不是6个字节。任何指针都很受欢迎?
答案 0 :(得分:3)
您已使用_int64
,因此sizeof
返回8.就像您决定使用可用64位中的48位一样。即使我们宣布这样的事情 -
struct my_struct {
_int64 var1:1;
} s;
仍然sizeof
会说8.简而言之,位域的分配将根据位域的类型进行。在这种情况下,它的_int64
因此分配8个字节。
答案 1 :(得分:1)
不幸的是,有点文件具有底层类型的大小,在这种情况下_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
,这会带来许多其他问题。
答案 2 :(得分:0)
我做了一些谷歌搜索。发现你可能能够使用__ 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会让事情变得有些尴尬(你需要调用a._m而不是a,我们可以使用它吗?)但至少它似乎比使用uint64_t更安全。