C语言复习笔记--数据在内存中的存储
今天我们来复习一下数据在内存中的存储方式.话不多说进入正题.
整数在内存中的存储
整数的2进制表⽰⽅法有三种,即原码、反码和补码.三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位最⾼位的⼀位是被当做符号位,剩余的都是数值位。
同样的补码去反+1也可以得到原码.对于整形来说:数据存放内存中其实存放的是补码.
这里就有个小问题,为什么存放的是补码呢?
在计算机系统中,数值⼀律⽤补码来表⽰和存储。
原因在于,使⽤补码,可以将符号位和数值域统⼀处理; 同时,加法和减法也可以统⼀处理(CPU只有加法器).
此外,补码与原码相互转换,其运算过程是 相同的,不需要额外的硬件电路。
大小端字节序和字节序判断
什么是大小端?
其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为⼤端字节序存储和⼩端字节序存储 .
大小端的概念一定要记清楚,不要记混了.
为什么有大小端?
一些练习
既然已经了解了大小端的概念,那么让我们看下下面的练习,来运用一下这部分知识.
练习1
设计⼀个⼩程序来判断当前机器的字节序
int main()
{int a = 1;if (1 == *(char*)&a){printf("小端\n");}else{printf("大端\n");}return 0;
}
练习2
题解及输出见下
练习3
注:整形提升时要看类型是否是有符号的,而不是看时以什么形式打印的.
题解和输出见下
练习4
解析和输出结果见下:
练习5
左边因为是无符号char,当加到256时会截断就又会变为0,所以会死循环打印hello world.
右边是无符号整数,无论如何也不会出现负数,也会死循环.减到0之后会变成2^32-1.
练习6
&a+1加的是整个数组的地址,ptr[-1]就是数组a的最后一个元素,为4.
将a转为int再+1就只是+1,也就是网前走一个字节.解引用并且用16进制打印需要4字节,这4个字节从低地址到高地址是00 00 00 02,因为是小端存储,所以打印出的是02 00 00 00.\
输出结果见下:(要在x86环境下运行)
浮点数在内存中的存储
先看一个引入,
上面程序的输出结果为
从上面的输出结果来看,浮点数的储存方式是不同于整型的,那么浮点数是如何存储的呢?
浮点数的存储
IEEE 754规定: 对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M,对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M.
浮点数存的过程
但是即便是这样一些浮点数因为有效位长度问题也只能近似存储.所以浮点数的相等比较不能直接用'=='.
想要深入了解浮点数比较可以看下C语言加餐--浮点数比较-CSDN博客这篇博客.
浮点数取的过程
指数E从内存中取出还可以再分成三种情况:
以上就是浮点数的存储规则啦.今日的复习就到这里了.我们下篇博客见.