前言:
1.字节序指CPU以字节位单位读取内存数据的顺序,字节序在进行网络通信过程中发挥重要作用。
2.数据存储。了解各种在内存中的存储形式有利于保证在进行不同类型数据运算过程中结果的正确性。
目录
一.字节序
二.数据存储
1.整型存储
2.浮点数存储
一.字节序
概念:CPU对内存中的数据以字节为单位进行存取的顺序
分类:
分类依据:内存有高低地址之分,数据的二进制有高低位之分
int a = 0x01020304
大端:低地址存高位 01 02 03 04
小端:低地址存低位 04 03 02 01
字节序针对的数据类型:存储单元大于一个字节的数据类型(即高于char)
主机字节序主要取决于CPU的架构:X86-小端;MIPS-大端
字节序主要影响网络通信时,不同主机字节序不同,会造成数据二义性。
网络字节序规定采用 大端字节序
编写一个简单程序辨别当前主机的字节序:
#include<stdio.h>
int main()
{
int a = 1;
char *p = (char*)&a;
if(*p == 1)
{
printf("小端");
}
else printf("大端");
return 0;
}
二.数据存储
1.整型存储
原码:一个数字直接转换而成的二进制数字
反码:原码符号位不变,数值位取反
补码:反码+1
整形数据在内存中的存储采用补码:节省了一些运算单元
ps:上述反码与补码规则只适用于负数,正数与无符号数的原反补码相同
2.浮点数存储
(1)小数如何转换为二进制数? 乘二取整法
0.25 ----> 01
(2)小数在内存中存储以浮点形式存储
5.25 ------> 1.0101 * 2 ^ 2
0.25 -------> 1.0 * 2 ^ (-2)
IEE754标准文档中规定,浮点数的表示分为三部分:
1. S-符号位 占据1个比特位 0-整数,1-负数
2. E-阶码位 在32位下占据8个比特位 +127
3. M-尾数 占据23个比特位
ps:由于阶码位的数值可能出现负数,但是阶码域是无符号的,无法表示负数
采用指数基数:127,真正阶码位存储的数据是实际指数值+127
由于浮点存储在进行浮点移动的时候,总会移动到第一个1的后边
所有数字的二进制表示都会采用科学计数法的方式转化为:1.xxxxx
采用这种方式表示后,在尾数部分,第一个比特位始终为1,因此在存储时将1忽略不计,在使用时再将其加入,这样即节省了一个比特位。
举个例子:
-3.125
转化为二进制: -11.001 -> -1.1001 * 2 ^ 1
浮点数的三部分表示:
S: 1
E: 1 + 127 = 128 -> 1000 0000
M: 1.1001
真实存储表示:
1100 0000 0100 1000 0000 0000 0000 0000
float的数据存储范围为 -2^127 ~ 2^128
浮点数存储的两种特殊情况:
E全为0:此时阶码位的真实数值为-126 , M表示真实值,通常用于表示正负0.
E全为1:此时阶码位的真实数值为128,M为全0时表示正负无穷大
浮点数无法表示0,只能无限接近于0.
浮点数存储环境不同,三部分占据比特位不同:
32位:
S-占据1个比特位 E-占据8个比特位 M-占据23个比特位
64位:
S-占据1个比特位 E-占据11个比特位 M-占据52个比特位