目录
编辑
一·整型如何储存
二·整型大小端储存
三·浮点型规则介绍
四·浮点型如何储存进去
五·浮点型如何取出
一·整型如何储存
首先我们会输入整型变量的时候,计算机会进行存储,然而它是怎么储存的呢?首先我们要明白我们数字输入的是原码,而计算机在内存中储存的是补码。也就是说我们输入的数字首先转化为二进制的原码然后最终转化为补码储存在计算机内存中,然后我们获取的时候,它会由补码转化为原码供我们使用。
这里我们要注意当我们在编译器调试窗口监视的时候看到的是十六进制的数字,而且储存的顺序是倒回来的:
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;故该是个很大的数;
以上就是对它的简单理解。
不足之处大佬多多指点!无论身处何种地位,我始终坚守"不耻下问"的原则。对于我而言,学问无分高低,知识无分贵贱。即使面对一个看似微不足道的问题,我也会虚心请教,因为我相信每个问题都蕴含着学习的机会。不耻下问不仅是我对知识的尊重,更是我对他人智慧的认可。我深知,只有不断学习,才能不断进步,而这一切都离不开一颗愿意虚心请教的心。