栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据在内存中的存储

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据在内存中的存储

引言:我们计算机的数组究竟是怎么存储的呢,整数的存储与小数的存储有什么不一样呢,计算的时候会发生什么呢,存入的数据是怎么拿出来的呢,看完接下来的文章,相信你能解决这些问题

1.数据类型

2.整型的储存形式

3.浮点型的存储形式

4.大小端存储方式

1.数据类型

1.整型数据

在C语言中short,int,long,都是指signed 型即有符号型,但是char并不是,

char是否有符号取决于编译器,打大部分编译器都认为是有符号型

打印有符号整数用%d,打印无符号整数用%u

注意long 是4字节(long>=int)早期16位机器上int是2字节,所以有long 4字节 long long8字节

2.浮点型数据

float,double,一般flaot数据要在数据末尾加上f,否则默认是double型

如3.14 编译器认为是double型,3.14f是float型

3.构造类型

1.数组 (去掉数组就是数组类型)

下面是数组的初阶认识

CSDN

int a[10]={0};

把a去掉 int [10]就是类型 (大小为10的整型数组)

2.结构体,struct

3.枚举类型  enum

4.联合体 union

4.指针类型

下面有指针的入门介绍

 https://blog.csdn.net/AgoniTop/article/details/121432024

包括空指针类型 void*

void*是一种特殊的指针,他可以指向任何类型,但是void * 为 “不确定类型指针”,
void *不可以解引用,并且void*作变量给别的指针赋值前要强制转换类型,接下来看代码

这里void*并没有转换类型,但是他存储了int a的地址,但是不可以解引用,以及进行其他赋值操作,因为他还是void*类型

2.整型在内存中的存储方式

采用三种码制,原码,反码,补码(注意是整型,浮点型的存储在后面)

原码是直接根据最高位是符号位,其他根据数值大小填写的   如+1

就是 0000 0000 0000 0000 0000 0000 0000 0001 代表1的原码

反码就是在原码的基础上符号位不变,其他按位取反 (更~操作符不一样,~是全部按位取反)

补码就是在反码的基础上加1 (整数在计算机中存储的都是补码)

正数只有一个码,负数则有三种码,并且在内存中以补码方式存在

———————————————————————————————————————————

那么为什么需要补码呢,直接采用原码计算不就行了吗?

1.事实上计算机只有加法器,就也是只能进行加速运算,若以原码计算会发生错误

如1+(-1)

0000 0000 0000 0000 0000 0000 0000  0001  1的原码

1000 0000 0000 0000 0000 0000 0000 0001    -1的原码

————————————————————相加得

1000 0000 0000 0000 0000 0000 0000 0010     也就是-2(结果错误)

采用补码相加得方式主要遵循一个原则:整数加负数==0

 0000 0000 0000 0000 0000 0000 0000  0001  1的补码   

 1111 1111 1111 1111 1111 1111 1111 1111          -1补码

——————————————————————相加得

 1 0000 0000 0000 0000 0000 0000 0000  0000(33位)最前面进一越过该计算的存储空间,因此直接舍弃,此时1+(-1)=0【不得不感叹以前的科学家能想到这个方法】

2.用补码还不用考虑符号位的问题,统统加一起就行了

即可以同时考虑符号位和数值

3.浮点型在内存中的存储方式

如果采用上述整型的方法存储会造成精度丢失,因为二进制可以表示任何一个整数,但是不能精确的表示小数,如0.2怎么办是2的负几次方加负几次方?

因此在过去IEEEE754规定了浮点数在内存中存储,

表现为(-1)^S  *m  *2^E

浮点数的机器格式分三个部分,数符(表示正负)【即S控制】,阶码(表示通过科学计数小数点缩进的程度)【即2的多少次方,注意都是无符号型】,尾数(科学计数后小数点后的所有数)【即m】

首先 数符S ,   控制正负,0就是整数,1就是负数  (-1)的0次方或1次方。

然后是阶码E,阶码规定只有无符号数,那么这是如何做到的呢

标准中引入了中间值的概念,比如8位(8 bit)计算中间值就是127(2的8次方/2),11位就是1023

如果是2的-1次方,那么最后就是-1+127=126  (二进制)0.11转换成1.1*2^-1

阶码为正数也一样

如果取出的E是全0,这时真实值为-127,是一个非常小的数,因此尾数不会加上1,而是一直采用0.0...的方式取出,来表示无限接近于零甚至为零的数(符号取决于s)

如果如出的E是全1    此时如果尾数为0 ,表示正负无穷(也是取决于s)

如果不是上面的特殊情况,那么先取出符号位,然后取出阶码还原,然后取出尾数还原,最后根据浮点数的读取规则把数读出来

最后是尾数m,因为采用科学技术法,最后尾数必然是处于1到2之间,所以我们把1的那一部分也去掉,最后取的时候加回来就行了,

如0.11转换成(1+0.1)*2^(-1)

4.大小端存储方式

1.高字节数据放在高地址,小字节放在低地址————小端存储

2.高字节数据放在低地址,小字节放在高地址————大端存储

 (鼠标实在太难画了)

对于超过一个字节的数据,他一定有放入顺序和拿出顺序,大端字节存储就是从高字节开始一个字节一个字节开始往后存,拿的时候原路返回即可

ps,如果是截断取的是低字节!

如 int的类型的变量   存储为11 22 33 44 转换成char拿到的是44,而不是11

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/604698.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号