整数与浮点数在内存中的存储方式

前言
在学习整数和浮点数在内存中的储存方式前我们要先来了解原码,反码,补码的概念。
原码
原码指的是一个数在计算机中所占的位数,最高位是符号位,0表示正数,1表示负数,其余位表示数值。例如,一个8位二进制数的原码为10110110,其中最高位1表示负数,其余7位表示数值。
反码
反码指的是将原码中的符号位不变,其余位取反(0变1,1变0)得到的新数,例如,上述原码的反码为11001001。
补码
补码指的是将原码中的符号位不变,其余位取反再加1所得到的新数。例如,上述原码的补码为11001010。

在计算机中,负数采用补码表示,因为补码有一个很好的性质,即在计算机中加减法可以统一处理正数和负数,而不需要特别的处理。
既然我们已经了解了原码反码补码的概念,那么就让我们进入正题吧!
在这里插入图片描述

整数的储存

在计算机中整形数据的存储统一都是补码形式。使⽤补码,可以将符号位和数值域统⼀处理。同时,加法和减法也可以统⼀处理,此外,补码与原码可以进行相互转换,其运算过程是相同的,不需要额外的硬件电路。
在三十二位机器中1是这样存储的。
00000000 00000000 00000000 00000001(整数的原码反码补码都一样)
而-1是这样存储的
11111111 11111111 11111111 11111111(第一位是符号位,代表这是个负数)
有符号整形的话这32个一会代表-1,但是如果是无符号整形的话这会代表一个很大的数字。
因为不再有符号位,所以32个1就代表2^32-1了。
在六十四位机器中与三十二位机器的储存类似只不过会占用64个b比特位。

浮点数的储存

再讲浮点数的储存之前我们先来看这样一道题。

//运行这样一段代码会输出什么样的结果呢?,大家可以思考思考。
#include<stdio.h>
int main()
{
    
    
	int a = 9;
	float b = 9.0f;
	printf("%d %f %d %f", a, a, b, b);
	return 0;
}

结果是这样的。这是为什么呢?为什么第二个是0而第三个是一个这么大的数字呢?那就让我们先来了解一下浮点数的储存方式再来解答这道题。
在这里插入图片描述

计算机在存储浮点数根据国际标准规定任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
V = (-1)^S * M * 2^E
(一1)^S表示符号位,当S=0,V为正数;当S=1,V为负数.
M表示有效数字,M的值大于等于1,小于2.
2^E表示指数位。

比如浮点数4.0,写成⼆进制是 100.0 ,相当于 1.00*2^2 。 那么,按照上⾯V的格式,可以得出S=0,M=1.00,E=2。
在三十二位的浮点数中,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字。
M对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。

M的储存
1<=M<2,所以有效数字M的第一位总是1,那么如果我们只保留第一位之后的数字 .??????,而不保留 . 前面的1,到最后计算时我们在把1加到最前面,那么我们就可以保 存24位有效数字。因此在计算机内部保存M时,会舍弃掉第一位的1,直到最后再加上,以提高精确度。
E的储存
在三十二位机器中E由8位二进制数字组成,它的取值范围为0-255;在六十四位机器中E由11位二进制数字组成,它的取值范围为0~2047。但是科学计数法中的E是可以出现负数的,所以规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^1的E是1,所以储存成32位浮点数时,必须储存成1+127=128,即10000000。
一般来说E中储存的数字分为三种情况。
1, E中不全为0或不全为1
这种是最为常见的情况。
2,E中全为0
这时,E的真实值为-127(或-1023),这时M前不再补上1,而是0.????此时V是一个非常接近于0极其小的一个数字。
3,E中全为1
这时如果M中全为0,V就表示无穷大。
这样我们就介绍完了浮点数的储存了,那让我们再看看最开始的那道题。
首先整数9是这样储存的
00000000 00000000 00000000 00001001
用%f打印时会采用浮点型的读取方式,会这样读
0 00000000 00000000000000000001001
S——E—————— M
此时E全为0此时V是一个非常接近于0特别小的一个数,以float的精度打印只会打印出0.000000。
而浮点数9.0的是这样储存的。
0 10000010 00100000000000000000000
S——E—————— M
用%d打印时只会按照整数的读取方式来读取,
01000001 00010000 00000000 00000000
打开计算机算一下刚好答案就是1075970048。

尾声

相信大家看完之后一定对整数和浮点数的储存有了一定的理解,如果觉得博主写的不错的请关注博主,随手留下点赞和收藏O(∩_∩)O~,如果对c语言学习感兴趣,千万不要忘记关注此专栏:c语言学习更多知识分享敬请期待!

猜你喜欢

转载自blog.csdn.net/Tokai___Teio/article/details/134754516
今日推荐