引言:我们计算机的数组究竟是怎么存储的呢,整数的存储与小数的存储有什么不一样呢,计算的时候会发生什么呢,存入的数据是怎么拿出来的呢,看完接下来的文章,相信你能解决这些问题
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*类型
采用三种码制,原码,反码,补码(注意是整型,浮点型的存储在后面)
原码是直接根据最高位是符号位,其他根据数值大小填写的 如+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



