c ++使用数据类型声明指定数据长度

时间:2012-01-17 18:59:16

标签: c++

我遇到了这个我以前没见过的语法

struct A {
    int x:24;
};

x:24是什么意思?在C ++中你能指定一个变量应该只占24位的编译器,而不是int类型的32吗? 如果是,将占用哪24位?最左边还是最右边的?

4 个答案:

答案 0 :(得分:6)

这是bit fields feature。它从早期的C日开始就可以使用。微软有a nice write-up on this feature,其中包含漂亮的图片,显示了特定于编译器的布局(他们说图片是MS特有的)。

答案 1 :(得分:4)

这正是您的想法,称为位字段x有24位可用。

// standard 32bit integer:
0000 0000 0000 0000 0000 0000 0000 0000
// x (24 bit):
0000 0000 | 0000 0000 0000 0000 0000 0000
//        ^ -- cut off here
// other 8 bit available for other uses, for example:

struct A{
  int x : 24;
  int y : 8;
}; // sizeof(A) == sizeof(int) (most likely on 32bit architecture)

请注意,结构仍然是32位(或4字节)大,因为你不能只是切断那些多余的位。因此,当您有非常紧凑的空间要求并且需要尽可能多地将尽可能多的信息打包到尽可能小的空间时,位字段非常有用。

答案 2 :(得分:4)

  

如果是,将占用哪24位?最左边还是最右边的?

在C ++标准中未指定(§9.6/ 1:在某些机器上从右到左分配位字段,在其他机器上从左到右分配)。

通常取决于平台的字节顺序。在小端平台上,它将被填充为:

[ bits 0~7 ] [ bits 8~15 ] [ bits 16~23 ] [ bits 24~31 ]
----------------------------------------- --------------
                    x                         (padding)

并在big-endian平台中逆转

[ bits 0~7 ] [ bits 8~15 ] [ bits 16~23 ] [ bits 24~31 ]
------------ -------------------------------------------
  (padding)                       x

答案 3 :(得分:1)

位的排序是CPU Dependent。也许你可以在这个字段中写一些简单的东西,然后查看调试器中的内存字。