_int64位字段

时间:2012-03-06 06:32:16

标签: c struct field bit int64

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

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

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

但不知何故,在Windows 64上,此结构的sizeof总是返回8个字节而不是6个字节。任何指针都很受欢迎?

3 个答案:

答案 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更安全。