一、数据类型的详细介绍
(一)基本的数据类型:
char
short
int
long
long long
float
double
类型的意义:
重点:看待内存空间里储存的数据(补码)的视角
2、类型决定开辟空间的大小(而大小决定使用范围)
(二)类型基本归类(整型与浮点型)
1、整型家族
char
short
int
long
long long
因为 char类型 在内存中以其 对应的ASCII码值 进行储存,所以将其归为整型一类
(三)空类型 void
二、整型在内存中的存储
前置知识:原码、反码、补码
正数的 原码、反码、补码都是一样的
负数不一样
具体见:https://note.youdao.com/s/IjruzGdM
(一)数据在内存中以补码形式储存
为什么要这样做呢?
原因在于这样便于CPU计算:CPU中只存在加法(不含其他硬件的情况下),如果要进行数据的加减乘除,补码可实现,加法与减法直接补码相加减,具有同等效力;而乘法和除法则是补码的累加与累减
(二)大小端问题
大小端定义:
大端储存模式:数据的高位储存在低地址,低位储存在高地址(顺序存放)
小端储存模式:数据的高位储存在高地址,低位储存在低地址(逆序存放)
一定要了解高低地址和函数栈帧开辟和变量空间定义的相关知识
https://note.youdao.com/s/X9gjdDel
大小端存在原因:一般的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题(简单来说就是本来数据在内存中的存储顺序可以任意,但是为了更加便利操作等问题,出现顺序和你序存放)
一般的编译器为小端存储模式(逆序存放)
如 visual stdio :见 指针初阶 中 一、回顾内存中的那些事 中的 小点:变量数据在小端机器内存中是倒着存放的(不是数组)
https://note.youdao.com/s/CrbMAZby
经典相关例题:(百度笔试题)
简述大小端相关概念,并写一段代码判断当前机器是大端机器还是小端机器:
三、浮点型在内存中的存储
(一)浮点型存储规则
1、了解 S E M
规定 S E M 储存规则(类似于 科学技术法 )
S 表示正负(用 0 和 1)
M 表示真值(1< M < 2)
E 表示阶码(左移或右移的位数,左移后为正 右为负)
如 5.5
二进制为: (-1) ^ 0 * 101.1
(-1) ^ 0 * 1.011 * (2^ 2 )
S M E
上图中红色部分为不可修改部分(固定格式)
其中 2 ^ 2 中不可修改的 2 为二进制的权,如十进制写为 10 ^ ···
上例中的 5.5 ,S = 0 ,M = 1.011 ,E = 2
2、储存方式
在内存中的存储:
M 的储存:(二进制形式)
因为 1< M < 2(一点几几几)
所以省略小数点前的 1 ,留出位置给小数部分(可多存一位,精度更大)
二进制储存,左边开始存,后面补 0
如1.011,存入 M 相应的二进制位就是 01100000000000000000000
M 的储存位置如上,32位 和 64位 (32、64位表示 float 和 double精度,不是系统)
它们的储存位置和精度如上
E 的储存:(二进制形式)
1、E 的存入
E 存入内存中相应二进制位时,,E的值 需要加上 127 或 1023 再存入,
如浮点型 float,给 E 的二进制位有 8 位,E的取值范围是 0~255,是没有负数的(正数看待不然很麻烦),而一般来说 E 有时为负,要使它范围位于 0~255,所以在存入内存时要加上一个中间值,在国际佬们的测试和最后决定,中间值为 127
而double型 中间值是为 1023
2、E 的提取
分几种情况:
(1)E 不为 全0 或 全1(一般情况)
因为存入时加上了对应中间值 127 或 1023,那么提取时先减去中间值获得 E的真实值
(2)E 全为 0
全为0 即表示 这整个数趋近于0,E 的真实值 <= -127 ,可能比-127还更小,那现在我们就规定一下,只要出现这种 全0 的情况,就把真实值看做 -126,即 1-127
(double型就看做 -1022 ,即1-1023)
(3)E 全为 1
这时表示正负无穷大
提取步骤
(1)先提取 S,把符号先确定(避免忘记)
(2)再数后面的(float为)8位 或 (double为)11位 ,数完做好标记,避免M看错位
(3)看E是否为全0(全0 M不用加小数点前的1),再提取有效数字 M(看是否补1),根据E的值来移动小数点
(4)求出的 二进制科学计数法 还原为 十进制