C语言中常用数据类型内存存储形式

来源:本站
导读:目前正在解读《C语言中常用数据类型内存存储形式》的相关信息,《C语言中常用数据类型内存存储形式》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《C语言中常用数据类型内存存储形式》的详细说明。
简介:通过这几个例子应该能够很好的理解各种类型在计算机内存中是如何存储的。

常用数据类型在内存在占用的字节数:

C语言中常用数据类型内存存储形式

1、bool

通过sizeof(bool)计算得到该类型占用1个字节。

2、char

char是字符型,占用一个字节,即8位:

C语言中常用数据类型内存存储形式

即有2^8=256个状态,可以表示256个不同的值,只是当有符号和无符号时表示的范围不同,我们平时的所用的每一个字符在内存中都由8位2进制数来表示,比如字符’A’,在ASCLL码中对应十进制65,十六进制的0x41,在内存中为:

C语言中常用数据类型内存存储形式

C语言中常用数据类型内存存储形式

3、short、int、long

这三种类型表示整型数每种类型在内存中的长度为2、4、4字节,即16位、32位、32位。当有符号和无符号时每一种表示的范围都有所不同。

在内存中是以补码的形式存在。对于一个整数来说,它的补码就是它的原码本身。对于一个负数来说,它的补码为原码取反再加1。(注:原码就是这个数本身的二进制形式<整数的反码和补码都和原码相同>,反码是将其原码除符号位外各位求反,补码是在其反码的基础上加1.)

4、float(更为详细的转换可参看对(*(volatileunsigned&nb)

float型在内存中有4字节32位,采用IEEE754单精度浮点格式:

C语言中常用数据类型内存存储形式

如上图所示,该格式最高一位是符号位,0位正,1位负,后面8位为无符号整型数,表示范围为0~255,后面23位小数为,索引从22到0分别对应2^-1到2^-23,则表示的数为

C语言中常用数据类型内存存储形式

5、double

double型在内存中有8字节64位,采用IEEE754双精度浮点格式:

C语言中常用数据类型内存存储形式

如上图所示,该格式最高位也为符号位,0位正,1位负,后面11位为无符号整型数,表示范围为0~2^11-1,后面52位小数为,索引从51到0分别对应2^-1到2^-52,则表示的数为

C语言中常用数据类型内存存储形式

6、下面通过几个例子来深化对于这几种类型在内存中存储的理解

charch='A';//01000001shorts=ch;//0000000001000001cout<<s<<endl;

ch是字符型,字符‘A’在内存中为0100 0001,由于s是short型,在内存中占16位,这样复制过来后会将ch复制到s的低8位,则s为0000 0000 0100 0001。

shorts=323;//0000000101000011charch=s;//01000011cout<<ch<<endl;

在这一段代码中s是short型,在内存中占16位,而ch是字符型只占8位,在将short型复制给char型是不会为了保证接近而将高8位复制过去,而是将short的低8位复制给char,这样的话,在该段代码中s在内存中为0000 0001 0100 0011,则复制后ch为0100 0011 = 67,对应ASCLL码中‘C’,则会输出‘C’。

shorts=2^10+2^3+2^0;//0000010000001001inti=s;//00000000000000000000010000001001cout<<i<<endl;

将s复制到i的低16位,如注释所示。

inti=2^23+2^21+2^14+7;//00000000101000000100000000000111shorts=i;//0100000000000111cout<<s<<endl; //s=2^14+7

将int型复制给short型时会将低16位复制过来,如注释所示。

shorts=-1;//1111111111111111inti=s;//11111111111111111111111111111111cout<<i<<endl;

这个例子中s是负数,负数在计算机中是用补码表示的,short型-1的原码为1000 0000 0000 0001,则补码为1111 1111 1111 1111;

复制给int时为10000 0000 0000 0000 0000 0000 0000 0001,符号位仍在最高位,补码为 1111 1111 1111 1111 1111 1111 1111 1111;

inti=5;//00000000000000000000000000000101floatf=i;//01000000101000000000000000000000cout<<f<<endl;

由于int型和float型的协议不同,这样复制的开销会比较大,虽然两种类型都是32位,因为每次复制都将计算对应的位应该是什么。

5 = 2.5 * 2^1 = 1.25 * 2^2;则符号位为0,无符号整型数为exp = 2 + 127 = 129,0.25 = 2^-2;

所以f在内存中为:0100 0000 1010 0000 0000 0000 0000 0000

inti=37; //00000000000000000000000000100101floatf=*(float*)&i;//00000000000000000000000000100101cout<<f<<endl;

此时f和i在内存中是完全一致的,因为计算机在计算f是直接通过指针操作,虽然这篇内存区域原来存储的是int型,但由于通过转化为float型指针,计算机就认为该片内存中的内容就是float型的,所以直接将这篇区域中的数直接复制过来。由于37都落在了float型的小数位,所以f会是一个很小很小的浮点数。

提醒:《C语言中常用数据类型内存存储形式》最后刷新时间 2024-03-14 00:54:27,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《C语言中常用数据类型内存存储形式》该内容的真实性请自行鉴别。