Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有无符号短整数的结构的大小_C++_C_Bit Fields - Fatal编程技术网

C++ 具有无符号短整数的结构的大小

C++ 具有无符号短整数的结构的大小,c++,c,bit-fields,C++,C,Bit Fields,我在浏览我们的一个组织数据文档时,发现了以下代码 struct A { unsigned short int i:1; unsigned short int j:1; unsigned short int k:14; }; int main(){ A aa; int n = sizeof(aa); cout << n; } 最初我认为大小将是6字节,因为无符号短int的大小是2字节。但是上面代码的输出是2 bytesOn visual studio 2008 i:1

我在浏览我们的一个组织数据文档时,发现了以下代码

struct A {
 unsigned short int i:1;
 unsigned short int j:1;
 unsigned short int k:14;
};


int main(){
 A aa;
 int n = sizeof(aa);
 cout << n;
}
最初我认为大小将是6字节,因为无符号短int的大小是2字节。但是上面代码的输出是2 bytesOn visual studio 2008

i:1,j:1和k:14是否有一点可能使其成为位域或其他什么?这只是一个猜测,我不是很确定。谁能帮我一下吗?

是的,这确实是位域

我不太肯定C++,但是在C99标准中,按照第7.7.2.1章10:< /P> 一个实现可以分配任何足够大的可寻址存储单元来容纳一个位字段。如果仍有足够的空间,结构中紧跟在另一位字段之后的位字段应打包到同一单元的相邻位中。如果剩余空间不足,则将定义是否将不适合的位字段放入下一位或与相邻单元重叠。单元内位字段的分配顺序由实现定义,即从高阶到低阶或从低阶到高阶。未指定可寻址存储单元的对齐方式

这使得您的结构大小为1位+1位+14位=16位=2字节

注意:此处不考虑结构填充

编辑:

根据C++14标准第§9.7章

表单的成员声明符

identifieropt属性说明符seqopt:常量表达式

指定位字段;其长度由冒号从位字段名称中偏移。类对象内的位字段的分配是 实现定义。位字段的对齐由实现定义。位字段被打包到一些可寻址的分配单元中


这是一个有点复杂的领域。大小为16位。这个问题非常广泛,在书中已经解释了很多次。你猜对了,这是位域的语法。您可以通过检查C或C++中的位字段的引用来轻松地验证它,它至少有2字节大。