数据的存储

挺久没写博客了,最近在搞GitHub,把这个忘了,实在抱歉;

有空做一篇GitHub上传项目的教程;

本人开始深入学习C语言了,总结一波基础知识

数据的存储

一、整型

1.int

对于整型来说,数据存放内存中其实存放的是补码

正数的原码、反码、补码都相同

补码=反码+1

另外,说下存储模式;有两种,分为大端(存储)模式和小端(存储)模式;

大端(存储)模式:数据的低位保存在内存的高地址,而数据的高位保存在内存的低地址;

小端(存储)模式:数据的低位保存在内存的低地址,而数据的高位保存在内存的高地址;

这样说可能不够形象,现在我给一个整数为20,那么它的地址就为0x000014,

低地址------------------------------------------------------>高地址

小端模式下就是14 00 00 00,大端模式:00 00 00 14

现再给一个整数1,地址就为0x000001,小端模式:01 00 00 00 ,大端模式:00 00 00 01

数据的存储_第1张图片

百度2015年系统工程师笔试题就有这么一道,

大端字节序和小端字节序的概念,写一个小程序判断当前机器的字节序

概念已经在上面了,用自己理解的话表达出来即可;

程序如下:

数据的存储_第2张图片

我自我认为我写的很详细了;

2.char类型,char a=-128你们知道它的十进制无符号数字吗?(这里需要用到补码计算了)

数据的存储_第3张图片

过程我很详细的给大家注释好了

结果是多少呢?

数据的存储_第4张图片

255,strlen表示求字符串长度,遇到\0停下,但现在没有\0,你是不是以为会是随机值,错!!

表达式-1-i;每循环一次就多-1,在char类型中,-1-i 最后减到-128-1=127,127-1减到3 2 1 0

由此可以推出128+127=255,char类型的范围就只有这么大。

数据的存储_第5张图片

经过上面的表述,这个死循环应该是没问题了吧

数据的存储_第6张图片

3.无符号unsigned

数据的存储_第7张图片

代码实现的过程都注释好了,不懂就问

死循环的原因你找到了吗?

数据的存储_第8张图片

因为i为无符号数,所以不存在负号,最后i会一直为0循环下去,你想到了吗?

二、浮点型

浮点数的存入和拿取

IEEE754规定:对于32位的浮点数,最高1位的符号位s,接着的8号位是指数E,剩下的23位有效数字M。

首先,E为无符号数,我们知道,科学计数法中的E是可以出现负数的,所以IEEE754规定,存入内存时E的真实值,必须加上一个中间数,对于8位的E,这个中间数是127,对于11位的E,这个中间数是1023。

1>.放入

给定一个浮点数9.0,化二进制1001.0,存入内存中

用公式表达就是(-1)^0*1.001*2^3

              也就是(-1)^s*   M   *2^E     s - 0;   M - 1.001;    E - 3;

给定一个浮点数0.5,化二进制.0.1  相当于(-1)^0*1.0*2^-1;    E = -1+127 = 126

再给定float f=5.5;  化二进制101.1,相当于(-1)^0*1.011*2^2 ,E=2+127=129

                                用32bit位表示 0 10000001 01100000000000000000000

                                用内存表示0x40b00000

2>.拿取

指数E从内存中拿取可以分为3种情况

<1>.E不全为0或不全为1; 

       如上例, 拿出时E-127=2;

<2>.E全为0(很少见,了解即可);

       E=-127, 一个超级小的数字,用科学计数法表示就是 +/- 1.xxx*2^-127(几乎不存在的数字), 

      所以,规定这种情况下,浮点数的E=1-127即为真实值,有效数字不再加上第一位的1,而是还原为0.xxxxxx的小数,这样做是为了方便表示+/-0,以及接近于0的很小的数字.

     0 00000000 01100000000000000000000

     +/-0.011*2^-126

<3>.E全为1(了解即可);

     0 11111111 01100000000000000000000

     E+127=255,      E=128,      

     1.xxxxxx*2^128    表示正负无穷大的数字

实操一波

数据的存储_第9张图片

解答如下

数据的存储_第10张图片

不难看出,整数型和浮点型的放入和拿取的方式不同。

 

你可能感兴趣的:(c语言)