首页 > 编程知识 正文

sqrt在c语言中怎么用,sizeof函数c语言

时间:2023-05-03 17:44:56 阅读:118216 作者:3678

典型的32位计算机对于每种数据类型都有以下存储空间:

char : 8位

短: 16位

int : 32位

长: 32位

浮动: 32位

双精度: 64位

一.结构体struct

#如果没有#pragma pack宏:

三个原则:

(1)数据成员的对齐规则()原则1 ) ) )。

结构结构的数据成员。 第一个数据成员位于offset为0的位置,然后每个数据成员的开始位置以该成员大小的整数倍开始。 (例如,int在32位计算机上从4的整数倍开始存储。)

(2)以结构体为成员) )原则2 ) )。

如果一个结构同时包含结构成员,则结构成员必须从其内部最大元素大小的整数倍的地址开始存储。 例如,如果结构a包含结构b,结构b包含char、int和double元素,则b必须存储为8 (即从double大小的整数倍开始)。

(3)结构体的大小) (原则3 ) )。

也就是sizeof的结果。 在按照以往的对齐原则计算大小的基础上,必须是其内部最大成员的整数倍,必须弥补不足(例如,如果结构中最大的是双精度,当前计算的是11,则总大小是16 )。

typedef struct bb{

int id; //【0】.【3】4字节

双权重; //【8】……【15】原则1

浮动高度; //【16】……【19】如果总长是8的整数倍,那么只要凑齐,总长就会变成【0】~【19】,补充【20】……【23】。 (原则3 ) ) ) ) ) ) ) ) ) ) ) 652

(bb;

类型结构AA {

char name[2]; //【0】,【1】

int id; //【4】……【7】原则1

双内核; //【8】.【15】

短等级; //【16】,【17】

BB b; //【24】……【47】原则2、因为BB内部最大的成员是double,即从8的整数倍开始存储

(aa;

如果是:

输入主(语音) )。

{

printf(sizeof(bb ) ) dn sizeof (aa ) ) dn )、sizeof (bb )、sizeof (aa );

返回0;

}

结果如下

Sizeof(bb )=24

Sizeof(aa )=48

但是在Linux环境中,使用gcc的结果是

Sizeof(bb )=16

Sizeof(aa )=36

你觉得是为什么?

如果以上结果为没有#pragma pach(n ),现在我们来谈谈#pragmapach

2 .有2.#pragmapack(n )

#pragmapach(n )将变量设置为以n字节对齐。 其中n是1、2、4、8和16,n字节对齐可以是存储变量的第一个位置的偏移。

(1)如果n等于或大于变量所占字节数,则偏移量必须满足默认字节对齐方案,即变量所占字节数的整数倍

)如果n小于变量所占的字节数,则偏移量为n的整数倍,不需要满足默认对齐方式。

因此,结构的大小可以分为两种情况。

)1)如果n大于所有成员类型所占的字节数,则结构的总大小必须是所占区域最大变量所占区域的倍数。

)2)否则,必须是n的倍数

因此,在上面的代码中加入#pragmapack(1),得到bb:(0~3) (4~11 ) ) 12~15 )=16

aa:(0~1至1 ) 2至5 ) 6至13 ) 14至15 ) 16至31 )=32

也就是说,#pargmapack(1)是没有对齐规则的。

但是,如果添加#pragmgpack(4),则bb:(0~3) (4~11 ) ) 12~15 )=16

aa:(0~1至1 ) 4至7 ) 8至15 ) 16至17 ) 20至35 )=36

二、union共同体(联合体) )。

一些变量共享一个内存位置,在不同的世界中存储不同数据类型和不同长度的变量。 当声明一个公共体时,编译器自动生成一个变量,其长度是联合体中元类型(像素族一样取类型长度)最大变量长度的整数倍,大于或等于最大成人所占的存储空间。

例如:

union foo{

char s[10];

int i;

(;

其中,foo的内存空间长度为12,是int型数据的3倍,而不是数组的长度10。 将int更改为double时,foo的空间为16,是double的两倍。

例如:

union mm{

char a; //1字节

int b[5]; //20字节

双精度c; //8字节

int d[3]; //12字节

(;

sizeof(unionmm )=8*3=24;

另外:

在共用体包含结构体情况下,

结构inner {

char c1;

双精度d;

char c2;

];

union data4{

结构输入器t;

int i;

char c;

(;

由于data4共用体有inner结构体,因此节本数据类型为double、8字节排列。 共用体的长度取决于t,因此sizeof(uniondata4)=24

结构体中包含共用体时,共用体中的地址为在共用体自身内部对齐的位数。

类型定义单元{

龙格;

int k[5];

char c;

}日期;

结构数据{

int cat;

char cc;

日期cow;

char a[6];

(;

于是,sizeof(date ),在结构体中为4 )1)3) 4对准) 20 )6) 4对准)=36

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。