当前位置: 首页 > news >正文

C语言-深度剖析数据在内存中的存储

一、数据类型的介绍

基本的内置类型:

char		//字符类型,变量大小为1个字节
short		//短整型,变量大小为2个字节
int			//整型,变量大小为4个字节
long		//长整型,变量大小为4/8个字节
long long	//更长的整型,变量大小为8个字节
float		//单精度浮点型,变量大小为4个字节
double		//双精度浮点型,变量大小为8个字节

1.1 类型的基本归类

整型家族:

charsigned charunsigned char
shortsigned short [int]unsigned short [int]
intsigned intunsigned int
longsigned long[int]unsigned long[int]

注:字符存储的时候,存储的是ASCII码值,是整型,所以归类的时候放在整型家族

浮点型家族:

float
double

构造类型:

数组类型
结构体类型 struct
枚举类型 enum
联合类型 union

注:数组类型的表示方式:

int arr[10];
//arr的类型就是int [10]
int arr1[8];
//arr1的类型是int [8]
char arr2[5];
//arr2的类型是char [5]
//[]内的数字不能去掉

指针类型:

char* pc
short* ps
int* pi
long* pl
float* pf
double* pd
...

空类型:

void

二、整型在内存中的存储

2.1 原码、反码和补码

计算机中整数有三种二进制表示方式:原码、反码、补码。

三种表示方式均有符号位数值位两部分,符号位位于最高位,都是用0表示正,用1表示负,而数值位则用0和1表示数据。

正整数的原码,反码和补码都相同。

负整数的三种表示方法各不相同。

例如-10:

原码:
直接将数值按照正负数的形式翻译成二进制即可表示原码。
-10的原码:10000000 00000000 00000000 00001010
反码:
原码的符号位不变,其他位依次按位取反即可得到反码。
-10的反码:11111111 11111111 11111111 11110101
补码:
反码加1得到补码。
-10的补码:11111111 11111111 11111111 11110110

注:原码到反码的转换有两种方式 取反加1减1取反 

对于整型来说,内存中存储的是补码

在计算机系统中,数值一律用补码来表示和存储。使用补码可以将符号位和数值位进行统一处理。同时加法和减法也可以统一处理(CPU只有加法处理器),此外负整数的补码和原码的互相转换(取反后+1)运算过程是相同的,不需要额外的硬件电路。

注:本质上内存中存放的是二进制,在VS上为了方便表示,显示的是16进制。

结论:内存中存放的是补码,并且是倒着存放的。

2.2 大小端介绍

大端小端:

小端存储模式:是指数据的低位字节的内容存放到内存的低地址处,把数据高位字节的内容
存放到内存的高地址处。
大端存储模式:是指数据的低位字节的内容存放到内存的高地址处,把数据高位字节的内容
存放到内存的低地址处。

小端:低位低地址,高位高地址。

大端:低位高地址,高位低地址。

设计一个程序判断当前机器的字节序:

//写一个程序判断电脑大小端
//返回1为小端
//返回0为大端
int check_sys()
{int a = 1;                //16进制表示0x00000001return *(char*) & a;
}
int main()
{int ret = check_sys();if (ret == 1){printf("小端\n");}else{printf("大端\n");}
}

注:两个16进制位可以表示一个字节,*(char*)&a的功能是取内存中第一个字节的内容,如果是小端存储,那么*(char*)&a取到的就是01,如果是大端存储,那么*(char*)&a取到的就是00

2.3 有符号和无符号的区别

有符号(signed)和无符号(unsigned)只针对整型,不针对浮点型

char到底是signed char还是unsigned char并不确定,但char在VS环境下一般表示signed char。
short = signed short
int = signed int
long = signed long
...

对于signed char和unsigned char来说,8个比特位在内存中存放的二进制的所有可能:

signed char的数值存储范围为-128~127,unsihned char的数值存储范围为0~255,并且这是一个循环的过程。

其他整型类型的表示范围可以在limits.h中查看:

CHAR_MIN, SCHAR_MIN, SHRT_MIN, INT_MIN, LONG_MIN, LLONG_MINCHAR_MAX, SCHAR_MAX, UCHAR_MAX, SHRT_MAX, USHRT_MAX, INT_MAX, 
UINT_MAX, LONG_MAX, ULONG_MAX, LLONG_MAX, ULLONG_MAX

三、浮点型在内存中的存储

常见的浮点数:

浮点数:数学中的小数,并且小数点位置可以浮动
123.45 == 12.345*10^1 == 1.2345*10^2
1E10 == 1.0*10^10
浮点数家族包括:float、double、long double

3.1 浮点数存储规则

根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:

V = (-1)^S*M*2^E
(-1)^S表示符号位,当S等于0,V为正数,当S等于1,V为负数
M表示有效数字,大于等于1,小于2
2^E表示指数位

例如:

5.5		-10进制浮点数
101.1	-转化为二进制浮点数的表示形式
按照上面的格式V = 5.5 == (-1)^0*1.011*2^2
S=0,M=1.011,E=2

IEEE 754规定:

对于32位的浮点数,最高的一位是符号位S,接着8位是指数位E,剩下的23位为有效数字M。

对于64位的浮点数,最高位是符号位S,接着11位是指数位E,剩下的52位为有效数字M。

IEEE 754对有效数字M和指数E还有一些特别的规定。

前面说过,1<=M<2,也就是说M可以写成1.xxxxxxxx的形式,xxxxxxxx表示小数部分。

IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxxxx部分。比如保存1.011的时候,只保存011,读取的时候再把第一位的1加上去。这样做的目的,是节省一位有效数字。以32位浮点数为例,留给M的位数只有23位,舍去第一个1后等于可以保存24位有效数字。

至于指数E,情况就比较复杂。

首先,E是一个无符号整数,这意味着,如果E为8位,它的取值范围是0~255,如果E为11位,它的取值范围为0~2047。但是我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如2^10中的E是10,所以保存为32位浮点数时,必须保存为10+127=137,即10001001。

然后指数E从内存中取出还分为3种情况。

E不全为0或E不全为1:

这时,浮点数就采取下面的规则表示,即指数E的值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1

例如:

5.5		-10进制浮点数
101.1	-转化为二进制浮点数的表示形式
按照上面的格式V = 5.5 == (-1)^0*1.011*2^2
S=0,M=1.011,E=2
E存储时为2+127=129
5.5在内存中的存储为:
0 10000001 01100000000000000000000

E全为0:

这时浮点数的指数E的值为-127或-1023,如果有效数字M不再加上第一位的1,
而是还原为0.xxxxxxx的小数,那么E的值就会变为1-127或1-1023。这样做是
为了表示正负0或一个接近0的很小的数字

E全为1:

如果此时有效数字M全为0,表示无穷大,正负由S决定
http://www.dtcms.com/a/431576.html

相关文章:

  • AI时代,我们仍然需要真实的人吗?
  • jsp网站开发实例标题栏ck播放器整合WordPress
  • 网站设计色彩搭配做网站要求高吗
  • 一级造价工程师报考条件及科目四川seo策略
  • 网站主题类型百度统计平台
  • 青岛知名网站建设哪家好成都网站建设成都网络公司
  • wordpress生成网站模版百度app官方下载
  • 基于Napcat+Koshi的QQ群AI大模型机器人部署-幽络源
  • c2c电子商务网站的功能wordpress滑动注册
  • 网站建设意向表物联网平台软件
  • 科凡网站建设怎么样南昌网络营销公司
  • 南宁市住房和城乡建设局网站软件商城下载
  • 正能量网站入口免费安全小程序商店代码
  • 玉溪网站制作公司3g下订单的网站怎么做
  • 电子商务网站怎么做推广湘潭网站建设 磐石网络最好
  • 数据治理8-数据治理成熟度与管理
  • 14.模板进阶
  • python中and和or,和c语言中和||不一样,需注意。
  • FliFlik KlearMax支持图像变清晰、老照片修复、黑白照上色、漫画上色等功能
  • HarvardX TinyML小笔记3(番外2:OV7670平替)(TODO)
  • 【Qt】布局管理器
  • 唐山免费自助建站模板做电影字幕的网站
  • 来料加工管理软件如何快速建档
  • OSPF Exchange 状态 概念及题目
  • Python基础(②⑥分库分表)
  • PHP做的哪些大型网站最新新闻热点事件2023
  • 第3篇|风机分类与外部条件:给风机“分班级、发考纲、出试卷”
  • 武昌做网站的公司wordpress 改造
  • 量子遗传算法是一种将量子计算原理与遗传算法相结合的智能优化算法,代表了进化计算的一个有趣分支
  • jsp做的网站代码株洲百度推广地址