首页 > 试题广场 >

求sizeof(s)

[单选题]
struct s
{
    int x: 3;
    int y: 4;
    int z: 5;
    double a;
}
求sizeof(s)
  • 16
  • 32
  • 20
  • 24
推荐
需要看清楚该结构体中是位操作,三个变量共占用一个int类型的大小,int类型占用4个字节,double占用8个字节。为了实现内存对其,int类型需要填充4个字节的长度。

选A
编辑于 2015-01-26 16:33:37 回复(14)
       有些信息在存储时,并不需要占用一个完整的字节,而只需占用几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进制即可。为了节省存储空间,并使处理简单,C语言提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
       题目中的x,y,z是一个int型的3个位域,因此以一个int来计算,a是一个double型,字符对齐,因此共占16个字节。
       关于更多位域对齐知识,请参考下面的博客:
       http://www.cnblogs.com/bigrabbit/archive/2012/09/20/2695543.html

发表于 2015-08-10 19:29:47 回复(0)
x,y,z 分别占用3,4,5 位,int是4个字节32位,相当于xyz 占用4个字节,double 占8个字节,按照对齐原则,前面补4位,4+4+8=16  。有一个条件是默认8字节对齐,如果前面加上一句 #pragma  pack(4)//设定为4字节对齐 结果就是12.
编辑于 2015-07-23 11:36:01 回复(5)
这个题目考虑两个点…1、位域,x,y,z分别是3bit,4bit,5bit,但首先需要注意,8bit对齐一个字节,所以x,y属于int的第一个字节,z是int的第二个字节,该int还有两个字节没有使用。2、在没有说明的情况下,结构体中的字节对齐按最大长度的变量的字节数对齐,也就是这里的double,8字节对齐,一共16字节。
发表于 2017-06-03 18:26:34 回复(0)
冒号后面的3,4,5是占多少位的意思,不是占多少字节的意思。3个int总共占了12位,不到两字节,当做2字节来看,然而,double是8字节的,内存对齐,所以是16字节。
编辑于 2018-03-23 12:01:42 回复(0)
这个题很巧妙:
1.首先前三个int类型每一个只占几位,合起来占用了12位,,所以他们三个共用了一个int型,但是double类型占用了8个字节,为了内存对齐,int类型要填充四个字节,所以一共用了16个字节
发表于 2015-08-23 10:36:51 回复(0)
“int+名称+冒号+数字”的写法叫“位域”,数字表示占多少位。一个int是4字节32位。
发表于 2021-09-06 14:27:16 回复(0)
首先结构体中最宽的是8字节的double,所以结构体按照8字节对齐。而我们发现x,y,z属于int型的位域,而且三个位域所占的位数为12位,未超过一个int型所占的32位,因此只需要4个字节就可以表示xyz。另外,由于double自身的对齐方式为:8字节,所以最终sizeof(s) = 16.

发表于 2017-09-14 10:00:02 回复(0)
选A:
变量后面:数字,是结构体中,xyz一共占了9个二进制位,然后a是8个字节,根据对其的原则,一定要是a的倍数,所以是16字节
发表于 2015-04-24 19:42:22 回复(0)
x,y,z加起来总共12位,不足4个字节,根据对齐原理当做4个字节处理,而在这个结构体中实际对齐字节为8,所以要把xyz所占的字节加上a所占的8个字节,再加上4个(浪费)字节 = 16个字节
发表于 2019-04-23 17:35:40 回复(0)
x,y,z分别占据int内3,4,5个位,而int占四个字节,范围为0-3,结构体默认为8字节对齐,故double
范围为8-15,总字节数为16是8的倍数,故sizeof(struct s)=16

发表于 2015-06-28 19:40:53 回复(1)
这里是按8个字节对齐的
发表于 2020-08-08 12:27:50 回复(0)
注意看清题目,结构体中是位操作
   有些信息在存储时,并不需要占用一个完整的字节,而只需占用几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进制即可。为了节省存储空间,并使处理简单,C语言提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
       题目中的x,y,z是一个int型的3个位域,因此以一个int来计算,a是一个double型,字符对齐,因此共占16个字节。
1. 位域
2. 字节对齐
编辑于 2017-09-08 10:31:09 回复(0)
学习之后有了大概的了解。这篇文章是2012年的,VS2015编译器做出了一些改进。
经过测试,总结了如下:
1,位域可以跨两个字节,unsigned c : 20;依然有效;
2,连续的位域列表,数据在4字节内连续存放,如果某数据存放时,当前单元剩下的位置不足以存储该数据时,并不需要对其从下一个单元开始存放;
3,如果位域列表中间有一个其他数据类型,则视为两个位域列表,这是需要用到以前的对齐知识。









编辑于 2017-07-13 14:36:58 回复(0)
       来自@努力去BAT的女子
       有些信息在存储时,并不需要占用一个完整的字节,而只需占用几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进制即可。为了节省存储空间,并使处理简单,C语言提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
       题目中的x,y,z是一个int型的3个位域,因此以一个int来计算,a是一个double型,字符对齐,因此共占16个字节。
位域知识详情http://www.cnblogs.com/bigrabbit/archive/2012/09/20/2695543.html
发表于 2017-05-08 16:48:00 回复(0)
注意看清题目,结构体中是位操作呢,
发表于 2016-05-19 14:41:07 回复(0)
啥头像
答案为A
关键点:
1. 位域
2. 字节对齐
发表于 2016-02-28 19:45:25 回复(0)

结构体中的数据对齐

发表于 2016-02-04 16:22:21 回复(0)

这个结构体的大小取决于编译器对内存对齐的处理方式,同时也受到各个成员变量的类型和顺序的影响。在这个结构体中,包含了三个整型成员变量 x, y, z 和一个双精度浮点型成员变量 a。

首先,x, y, z 分别被定义为 3 位、4 位、5 位的有符号整型,这意味着它们的存储空间分别为 3/8 字节、4/8 字节、5/8 字节,但是实际上由于内存对齐的原因,它们会被分别舍入到最接近的 1 字节、1 字节、1 字节。所以,x, y, z 各自占据 1 字节的存储空间。

其次,双精度浮点型成员变量 a 占据 8 字节的存储空间。

由于内存对齐的原因,结构体 s 的总大小将是其最大成员变量所占据的存储空间的整数倍。在这个例子中,最大成员变量是双精度浮点型变量 a,所以结构体 s 的大小将是 8 的整数倍。

因此,结构体 s 的大小为 16 字节。

发表于 2023-11-08 15:57:24 回复(0)
冒号后面的3,4,5是占多少位的意思,不是占多少字节的意思。3个int总共占了12位,不到两字节,当做2字节来看,然而,double是8字节的,内存对齐,所以是16字节。
发表于 2023-08-27 22:44:20 回复(0)
这是一个结构体定义,其中包含了三个位域成员x、y、z和一个普通的双精度浮点型成员a。位域是C/C++中的一种数据类型,用于将一个整数类型的数据按照位数进行分割,从而节省内存空间。在这个结构体中,x占3位,y占4位,z占5位,分别表示可以存储的最大值为7、15和31。
需要注意的是,位域的使用需要根据具体情况进行权衡。虽然位域可以节省内存空间,但是在某些情况下,位域的使用可能会带来一些问题,例如位域的跨度问题、位域的存储顺序问题等等。因此,在使用位域时需要注意相关的规范和限制,以避免出现不必要的问题。
发表于 2023-05-05 22:06:52 回复(0)