C语言复习笔记--数据在内存中的存储

发布于:2025-05-01 ⋅ 阅读:(13) ⋅ 点赞:(0)

        今天我们来复习一下数据在内存中的存储方式.话不多说进入正题.

整数在内存中的存储

        整数的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从内存中取出还可以再分成三种情况:

 

        以上就是浮点数的存储规则啦.今日的复习就到这里了.我们下篇博客见. 


网站公告

今日签到

点亮在社区的每一天
去签到