当前位置: 首页 > news >正文

C语言:整数、浮点数在内存中的存储

hello,我又来了!~

内存存储

  • 1、整数在内存中的存储
  • 2、浮点数在内存中的存储
  • 3、2中的例题解释

1、整数在内存中的存储

我们知道:整数的表达式有三种,即:原码、反码和补码
正整数的原码、反码和补码都相同。
负整数的三种表达式各不相同。
原码:将数值按照负数的形式翻译成二进制得到原码。
反码:原码的符号位(首位)不变,其他位依次按位取反就得到反码。
补码:反码+1 。

对整型来说,数据存放的是二进制的补码
原因:计算机系统中用补码来表示数值的大小和数值存储,用补码可以将符号位和数值域统一处理,CPU只有加法器,当用补码时可以统一处理加法和减法,补码与原码的转化的运算过程是相同的(原码取反+1得到补码,补码取反+1得到原码),这样存储不需要额外的硬件电路。

2、浮点数在内存中的存储

常见浮点数有:3.1415926等等,
浮点数类型包括:float、double、long double类型
浮点数表示范围:float.h中定义

让我们由下面这道题,来揭开它的神秘面纱
代码:

#include <stdio.h>

int main()
{
	int n = 6;
	float* fn = (float*)&n;
	printf("n:  %d\n", n);
	printf("*fn:%f\n", *fn);

	*fn = 7;
	printf("n:  %d\n", n);
	printf("*fn:%f\n", *fn);

	return 0;
}

大家认为会是什么样的结果呢?没有学过的兄弟们思考一下。

结果:
在这里插入图片描述
我当时看到结果也吓了一跳,怎么会是这样的结果呢?

浮点数的存储是有国际标准的,根据电气和电子工程协会(IEEE)754标准任意一个二进制浮点数v可以表示成下面的形式:
v=(-1)S*M*2E
(-1)S表示符号位,当S为0时,v为正数,当S为1时,v为负数。
M表示有效数字,M是>=1且<2的
2E表示指数位

以十进制5.0为例:它写成二进制形式是101.0,(S=1,M=1.01,E=2)所以是1.01*2^2。
可以看出我们只要确定S、M、E就可以确定这个二进制浮点数。
因此,在内存储存的时候也是主要存储这三个数,
IEEE 754规定:
对于32位即4字节的浮点数,最高1位存储符号位S,接着8位存储指数E,剩下23位存储有效数字M
在这里插入图片描述

对于64位即8字节的浮点数,最高1位存储符号位S,接着11位存储指数E,剩下52位存储有效数字M
在这里插入图片描述
根据,科学计数法,M可以写成1.XXXXXX*2E的形式,也就是说M的整数部分会始终是1,因此在储存的时候可以不储存,只储存它的小数部分,等到读取的时候再将再把第一位的1加上,IEEE 754就是这样规定的。

指数E的情况更为复杂,
E是一个无符号整数,当他出现负数时,情况会有所不同,所以IEEE 754规定存入内存时,真实值,必须再加上一个中间数,对于8位的E,这个中间数是127,而对于11位的E这个中间数是1023。

举例:
我们依然以float类型数值5.0为例,它是1.01*22
那么它的浮点数二进制存储是:
0 10000001 01000000000000000000000
写成16进制数是0x40 a0 00 00

在这里插入图片描述
图片中右上角第一个就是,因为在内存中是小端存储,我们一看,欧呦,还真是这样存放的。
在取的时候分为3中情况:
1.E不全为0或不全为1
E的计算值减去127或1023,得到真实值,再将有效数字M前加上第一位的1即可。
2、E全为0
加上127或1023还是0,可以想象到这个数字有多小,2的32次方就是42亿多的数字,而它是2的负127或负1023次方,已经趋近于0了,IEEE 754 规定它还原为0.XXXXXX,这样是为了表示正负0,及接近于0的数字。
3、E全为1
这个就不在过多解释了,它趋近于正负无穷大。

3、2中的例题解释

接下来我们来解释一下题目为什么是这个结果:
第一个整型变量打印肯定是6,不用解释,
第二个:
6转化为2进制数是00000000000000000000000000000110
也就是:E全为0的情况,所以打印出来是0.000000
第三个:
*fn=7;这种情况下,它的二进制是111.0,即1.11*22,即
0 10000001 11000000000000000000000
这个二进制当以整型打印出来是:
在这里插入图片描述
可以看到10进制结果和运行结果一样。
第四个:
和第一个的是一样的它的存储方式就是按照浮点数的存储方式存储的,所以打印出来是7.000000

好的,本期博客,讲解了,整数、浮点数是如何在内存中存储的

有什么不明白的地方,可以在评论区留言,我看到后会回复的,
记得多多支持博主哦~
byebye~

(~ ̄▽ ̄)~

相关文章:

  • 东莞网站建设 烤活鱼sem是什么意思呢
  • 微信公司网站百度指数趋势
  • 有哪些建设网站公司吗sem推广是什么意思呢
  • 做二手货车网站关键词优化怎么弄
  • 1免费网站建站百度极速版推广员怎么申请
  • 做甲基化黑点的网站网站排名优化需要多久
  • AWS Glue用Python Shell从Workday系统将人力资源原始数据以Parquet格式存入S3
  • LVS+Keepalived高可用高性能负载实战
  • 【Sql Server】随机查询一条表记录,并重重温回顾下存储过程的封装和使用
  • 计算机毕业设计SpringBoot+Vue.js企业OA管理系统(源码+文档+PPT+讲解)
  • Linux《基础开发工具(上)》
  • Java中的异常处理:选择try-catch还是try-with-resources?
  • 分布式性能压测
  • FREERTOS的三种调度方式
  • 微服务架构实践:SpringCloud与Docker容器化部署
  • 从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(七) 主题设置
  • 【Tomcat】
  • 基于Ubuntu2410部署LobeChat服务端数据库版本
  • 5-1JVM内存区域
  • 【记录】成为创作者的第 730 天(两年)
  • LeetCode 解题思路 7(Hot 100)
  • 【Java基础】Java 中 的`final` 关键字
  • Cocos Creator3.8.6拖拽物体的几种方式
  • rust学习笔记8-枚举与模式匹配
  • 使用Pycharm创建第一个Python程序
  • Maven入门教程