思维导图
目录
一.数据类型
二.原码 ,反码,补码
三.大小端字节序列介绍
四.浮点类型数据的存储
思维导图:
前言:
不知道你们是否有这样的疑惑:数据是以什么形式存储在计算机里面的???
在读取数据的时候,又是以什么形式拿出来的???
我们都知道计算机只能识别机器语言(二进制语言:0,1的数字)
因为计算机中的数据都是以二进制数的形式来存储的。
不知道怎么转换 的老铁们,不要急哈~~
十进制数化二进制数
1.十进制数:10进制数 10 化成二进制数
十进制数化二进制的规则:除2取余
1.数据类型
1.1基本类型(内置类型)
1.2构造类型
对于构造类型而言,具体大小是多少取决于构造类型的成员
1.3unsigned char 与 signed char 存储数据的有效范围
对于char 而言又进行细分:unsigned char 与 signed char
unsigned char 存储数据有效范围:0~ 255
分析见下:
signed char 存储数据有效范围:-127 ~ 127
分析见下:
1.4指针类型
1.5空类型
2.原码,反码,补码
-36的原码:100100B
反码 = 对应的原码的符号位不变,数值位按位取反 111011B
补码 = 对应的反码的符号位不变,反码 + 1 111100B
在计算机系统中,数值⼀律⽤补码来表⽰和存储。原因在于,使⽤补码,可以将符号位和数值域统⼀ 处理; 同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是 相同的,不需要额外的硬件电路。
3.大小端字节序列的介绍
3.1基本介绍
通过调试 -->窗口 -->内存 --> 输入 &a
可以看到a 对应的数据在内存里面存储的是:44332211
为什么倒着存储的呢???
这就不得不涉及到大小端字节序列存储的问题啦
当一个数据类型所占大小超过1字节之上(char 类型数据存储没有大小端之分),那么对应的内容存储在内存里面就涉及到大小端存放的问题,只不过,对于不同的编译器而言,到底是大端还是小端存储是不一样的。
⼤端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存 在内存的低地址处。⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存 在内存的⾼地址处。
对于VS而言:是小端存储模式
此时低字节序列的内容01 放在了内存低地址处
3.2练习
1)
当前代码输出是???
注意找亮点:数据类型不同;格式控制符是%d
分析如下:
主要是考察:%d 是以有符号10进制整形数据输出 ;无符号 char 提升为int 如何提升(高位补充0),有符号char 提升为int 如何提升(高位用符号位来补充)
运行结果:
2)
分析如下:
主要是考察:%u 是以无符号10进制整形数据输出 ;无符号 char 提升为int 如何提升(高位补充0)
运行结果:
3)
分析如下:
运行结果:
4)写一个程序,判断当前机器是大端还是小端模式
首先需要知道大小端模式的定义;其次需要知道如何把一个数据转换为二进制
5)
分析见下:
结果:死循环
首先i 是一个无符号char 类型的数据,存储数据的有效范围是 0~255,当 i = 255 ,执行i++后i 又重新从 i = 0开始新的一轮循环,不断重复此过程,导致最终死循环
6)
分析见下:
7)
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
分析见下:
关于此部分内容你明白了没???
4.浮点类型数据的存储
浮点数包括的类型有:float,double,long double4.
4.1任何一个二进制数都可以用浮点数来表示
统一的表示方法:V = (-1)^S * M * 2^E
(-1)^S :表示符号位,所以S 的值非1即0
M 表示一个小数 1.xxxxxxx
2^E 表示指数位
5.5 = 101.10B
= 1.011 * 10 ^2
= (-1)^0 *1.01*2^2 首先这个是个正数,所以S = 0
S = 0 M = 1.01 E = 2
对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M 对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
32位机器浮点数的存储方式
64位机器的存储
4.2.浮点数存的过程
1)在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后⾯的 xxxxxx(小数)部分。注意:当不够23位,后面自动补0
⽐如保存1.01的时候,只把小数点后面的保存:01,等到读取的时候,再把第⼀位的1加上去。
2)如果在32位机器上(E 只存储8位),它的取值范围为0~255;如果在64位机器上(E 只存储位),它的取值范围为0~2047。但是,我 们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上 ⼀个中间数,
对于32位机器,这个中间数是127;
对于64位机器,这个中间数是1023。
⽐如,2^10的E是 10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。
3)浮点数取的过程:分3 种情况
正常情况:E不全为0或不全为1
浮点数表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效 数字M前加上第⼀位的1。
E全为0
浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还 原为0.xxxxxx的⼩数(M此时为0)。这样做是为了表⽰±0,以及接近于0的很⼩的数字。
E全为1
如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s)
4.3练习
分析:
运行结果: