#整型与浮点型的储存问题#

目录

​编辑

一·整型如何储存

二·整型大小端储存

三·浮点型规则介绍

四·浮点型如何储存进去

五·浮点型如何取出


一·整型如何储存

首先我们会输入整型变量的时候,计算机会进行存储,然而它是怎么储存的呢?首先我们要明白我们数字输入的是原码,而计算机在内存中储存的是补码。也就是说我们输入的数字首先转化为二进制的原码然后最终转化为补码储存在计算机内存中,然后我们获取的时候,它会由补码转化为原码供我们使用。

这里我们要注意当我们在编译器调试窗口监视的时候看到的是十六进制的数字,而且储存的顺序是倒回来的:

int i=1;
00000000000000000000000000000001//这是二进制
 0x01 00 00 00//十六进制显示//vs下

这是究竟是为什么?这便引入了下面我们要讲的大小端问题。欲知后事如何,请听下回分解。

二·整型大小端储存

先简单介绍一下大小端,它其实是放置数据的两种不同的方式罢了:每个整型数据都会有尾字节,如果在大端机器它会把尾字节处数据放在高地址处,如果是小端的话,他就会放在低地址处;下面展示一个图,来详细说明一下吧。

这样我们会更加详细理解大小端问题把。

那么下面我们是不是可以根据这个来写个代码来判断机器是大端还是小端呢?

int main() {
	int n = 1;
	if (*(char*)&n == 1) {
		printf("小端");
	}
	else printf("大端");
	return 0;

我们用它判断出了vs2022是小端机器。 

三·浮点型规则介绍

首先,我们根据ieee754的规定是如何对浮点数进行处理的,首先所有的浮点数可以根据一个公式v=(-1)^s*m*2^E:其中(-1)^s表示符号位,而m是有效数字即尾数,1<m<2;2^E表示指数位,e即阶码

如:

四·浮点型如何储存进去

这里我们可以知道m一定可以写成1.xxxxxxxx形式,那么,在ieee 754规定下,我们会默认把这个1省略掉这样可以空出一位的空间使得要存的浮点数精确度更高一些。这样在32为我们精确的尾数就是24,而64位他就是53了。

下面我们对e的存入进行分析:首先我们要知道e是可以取0~8或者0~11的那么就意味着要存的这个二进制范围是0~255或者0~2047;但是根据ieee 754规定我们在存入的时候要加一个中间值,他在32位下是127,在64位下是1023;若是32位下就是e+127等,如果我们假设e=10;那么10+127=137化成二进制10001001储存起来,64位下也是同理。

五·浮点型如何取出

 当我们取出存入的数据时我们就要分三种情况进行讨论:

1·e全为0:那么也就意味这个没有存入之前的e很小;那么也就可以推测出原数字也特别小故m再还原为原来的数字可以不用加1;而是直接还原为0.xxxxxxxxx。

2·e全为1:那么就意味着原来数字加上中间数后还是特别大,原来未存入之前之前也特别大而±就要看s了。

3·e不全为0或者1:那么我们就按照怎么存入的再怎么拿出来;比如在32位下:(0.5)*(1/2);那么可以写成(-1)^2*1*2^(-1);然后我们将e存进去就是126;化成二进制01111110;然后减去1;得到23位:00000000000000000000000;最后储存的二进制就00111111000000000000000000000000。

下面我们举个例子:

#include <stdio.h>
int main()
{
	int n = 9;
	float* p = (float*)&n;
	printf("n的值为:%d\n", n);
	printf("*p的值为:%f\n", *p);
 
	*p = 9.0;
	printf("n的值为:%d\n", n);
	printf("*p的值为:%f\n", *p);
	return 0;
}

 这里我们定义的整型9:00000000 00000000 00000000 00001001;然后打印第一个应该是9;

接着我们把它转化为浮点型,并用浮点型指针访问应该是按照这样0 00000000 00000000000000000001001;那么我们去访问,由于储存的e全0;所以不用补;数字是个十分小的数故打印0,并精确到后六位;

我们要是按浮点型存入9.0;按浮点型放入:0 10000010 00100000000000000000000,那么当我们用浮点型指针去打印那么就会是9.000000;

但是我们浮点型存进去的结果用整型去打印  整型访问时就会变成每个字节分开的:01000001 00010000 00000000 00000000;故该是个很大的数;

以上就是对它的简单理解。

不足之处大佬多多指点!无论身处何种地位,我始终坚守"不耻下问"的原则。对于我而言,学问无分高低,知识无分贵贱。即使面对一个看似微不足道的问题,我也会虚心请教,因为我相信每个问题都蕴含着学习的机会。不耻下问不仅是我对知识的尊重,更是我对他人智慧的认可。我深知,只有不断学习,才能不断进步,而这一切都离不开一颗愿意虚心请教的心。
 

 

  • 37
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值