1

我需要在一个结构中使用一个 6 字节(48 位)位域,我可以将其用作无符号整数进行比较等。如下所示:

pack (1)
struct my_struct {
  _int64 var1:48;
} s;

if (s.var >= 0xaabbccddee) { // do something }

但不知何故,在 64 位 Windows 上,sizeof这个结构总是返回 8 个字节而不是 6 个字节。任何指针表示赞赏?

4

3 回答 3

3

您已经使用_int64并因此sizeof返回 8。就像您决定使用可用的 64 位中的 48 位一样。即使我们声明这样的东西——

struct my_struct {
  _int64 var1:1;
} s;

仍然sizeof会说 8。简而言之,位域的分配将根据位域的类型进行。在这种情况下,它_int64因此分配了 8 个字节。

于 2012-03-06T06:42:54.900 回答
2

不幸的是,位字段具有底层类型的大小,在这种情况下 _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,这会带来很多其他问题。

于 2012-03-06T06:42:16.747 回答
-1

我做了一些谷歌搜索。发现您可能可以使用__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.

于 2012-11-08T06:28:59.187 回答