学习目标:
学习数据在内存中的存储:
学习内容:
1、数据类型
1.1
char //字符数据类型 1字节
int ///整型数据类型 4个字节
short //短整型 2字节
long int //长整型 >=4字节
long long int //更长的整型 8字节
float //单精度浮点数 4字节
double //双精度浮点数 8字节
数据类型决定了开辟内存的大小;
整型中:
unsigned int //无符号的int 有些数据是没有负数的
char signed char //有时默认两者是一样的
unsinged char //char也是整型
long int
long long int
浮点数:
float
double
自定义类型:
数组
结构体 struct
枚举 enum
联合 union
指针类型:
char* p1 字符指针
int* p2 整型指针
float* pf 单精度指针
double* pf2 双精度指针
空类型:
void
主要用于函数的返回值,函数的参数,以及指针
2.整型在内存中的存储
int a =10;
int b = -10;
a,b在内存中是以二进制存储的,且存放的是整型的补码
一个整型4字节32比特位
int a = 10;
int b = -10;
//00000000000000000000000000001010 原码
//00000000000000000000000000001010 反码
//00000000000000000000000000001010 补码
//正数的 原 反 补 是相同的
//10000000000000000000000000001010 原码
//11111111111111111111111111110101 反码
//11111111111111111111111111111010 补码
//负数在内存中是以补码的方式存储的
//原符号位不变,其他位按位取反得到反码
//反码+1 得到补码
原码和补码之间的转换:
3.大小端字节序
当我们把ox11223344这样一个16进制数存在内存中时可以顺序,也可以逆序
11 22 33 44 也可 44 33 22 11
高 <——低
两种存放方式
介绍以及判断
一个小试题:
设计一个小程序来判断当前机器的字节序。
void pd(int a)
{
if (1==(*(char*)&a))
{
printf("小端\n");
}
else
printf("大端\n");
}
int main()
{
int a = 1;
pd(a);
return 0;
}
解析:
1的二进制
00000000000000000000000000000001
我们取出1的地址只用判断一位,因此强制转换为(char*)使他指向一个二进制位,正在解引用找到最低地址存放的数字
如果是小端,则最低位存放的是1
如果是大端,则最低位存放的是0
4.浮点数在内存中的存储解析
先看一例子:
我们可以发现,同一个数存储为不同类型时,输出的大小不一样。
浮点数的存储方式:
(-1)^S * M * 2^E
其中S是0或者1,0是正数,1是负数
M表示有效数字,大于0小于1的数
E表示指数位
比如十进制的5.0写成二进制位 101.0 也即是 1.01
其中按照:(-1)^0*1.01*2^2
S==0;M ==1.01;E==2
在内存中是这样存储的
对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
IEEE 754规定
因为M总是1开头,所以存储时是省去了的、只需要存 .0101 ,取出时在加上1
这样可以让有效数字多一个存储空间
i
E是非负的,因此防止出现负数
float存时加上127
doubl存储时加上1023
如 2^10 E为10,存储时加上127,实际存的是137;
将存进去的数取出来:
当E不全为0和不全为1时
比如00.5的二进制为 0.1 也就是 1.0*2^(-1)
S==0;M==1.0;E== -1;
E=E+127 ——> E=126;
0 01111110 0000000000000
当E 全为0时
E= -127
2^(-127)接近于0
当E 全为1时
E=2^128 是一个很大的数
现在来解释前面的例题
n=9.0;
强制转换为float型时
00000000000000000000000000001001 原本是这样存的
取出来时
S=0;E= -126;M=0.0000000000000000000000001001
M*2^(-126)接近于0
9.0是1001.0也即是1.001
存在内存中是
0 10000010 00100000000000000000000
转化为整型后
就是
0 10000010 00100000000000000000000
也就是
1091567616
结束
学习时间:
二零二二年九月十八日
学习产出:
- 技术笔记 2 遍
- CSDN 技术博客 1 篇
- 习的 vlog 视频 1 个
- 作业题10+