前言
今天给大家来介绍一下自己最近学习的数据类型的作用、字节序、整型存储、浮点型存储的知识点。
一、数据类型的作用
作用:
1.确定所能访问的空间大小
2.看待计算机中数据的角度(即告诉计算机这是什么类型的数据,读取时应该读取几个字节)
二、字节序
问题:为什么数据int a=0x11223344在我们的电脑内存中存储的方式是44 33 22 11 呢?
1.概念
CPU对内存中的数据以字节为单位进行存取的顺序
2.大端和小端
首先我们要知道,内存是有高低地址之分的,同时一个数据的二进制存储也有高低位之分,具体如下:
存储方式:
大端:低地址存高位(顺着存储)
小端:低地址存低位(反着存储)
例如以int a=0x01020304为例:
上图展示了两种存储方式在内存中的存储
那么我们的电脑究竟是大端存储还是小端存储呢?这取决于什么呢?
其实,我们的主机使用的字节数取决于 CPU架构 : X86(小端),X64(小端),MIPS(大端)
PS:总而言之,正常情况我们所使用的电脑都属于小端存储 。
3.字节序和网络通讯
字节序主要是在网络通信时,不同主机之间的通信,如果字节序不同会造成数据的二义性。所以,在网络通信时,一般会定义一个自己的网络字节序标准来规避。
三、整型存储
1.原码反码补码
以char类型的-10为例,最高位(符号位)为1表示负数,为0表示正数:
原码:一个数据直接转换成二进制 --> 1000 1010
反码: 符号位不变,数值位取反 -->1111 0101
补码:反码+1–>1111 0110
PS:对于正数和无符号数来说,原码=反码=补码。 |
2.使用补码存储的原因
我们要知道,整数在内存中的存储是以 补码形式来存储的,为什么呢?原因是 它可以节省一些运算单元。
例如:整数的加法运算和减法运算统统可以用加法来完成,不必再增设减法器:
1.加法:加法就是正常的表示。不进行赘述了。
2.减法运算(加法表示):
下面有一道例题来加深印象:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
char a = -1;//-1补码:11111111 11111111 11111111 11111111
signed char b = -1;
unsigned char c = -1;
printf("a=%d\nb=%d\nc=%d\n", a, b, c);
return 0;
}
输出结果:
a=-1
b=-1
c=255
四、浮点型存储
1.小数的二进制存储(32位)
方法:乘2取整法。
小数在内存中存储是以浮点形式存储的,例如:
IEEE754标准文档规定,浮点数的表示分为三个部分:
1.S-符号位,占据1个比特位(0表示正数,1表示负数)
2.E-阶码位(指数位) ,在32位中占据8个比特位(以2 + 127表示)
3.M-尾数,占据23个比特位(例如上图中的1.0101就是尾数)
以5.25的存储为例:
它可以表示为:
0 10000001 10101000 00000000 0000000
因为指数位的数值有可能出现负数,但是指数域是无符号的,无法表示负数,所以采用指数基数: 127, 真正指数位存储的数据是实际指数值+ 127
又因为浮点存储再进行会进行浮点移动,总会移动到第一个1的后边,因此所有的数表示都是:1.xxxxxxx
采用这种方式之后,因为尾数部分,第-个比特位总是存储1,如果把这个1忽略掉,采用这种规则,用的时候再给加上,1就不用存储了,就节省了1个比特位,提高了精度。
所以5.25实际存储的是这样的:
0 10000001 01010000 00000000 0000000
有一说一,可能有点晦涩难懂,可以看一下这个例题来结合理解: