ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

详解c语言整形和浮点数在内存中的存储

2021-11-27 12:58:21  阅读:124  来源: 互联网

标签:存储 字节 浮点数 char 详解 内存 整形 原码


目录

数据在计算机的存储方式(补码,反码,原码)

整形在内存中的存储:

   整形类型

大端字节序和小端字节序

浮点数在内存的储存


数据在计算机的存储方式(补码,反码,原码)

在32位机器上,计算机储存数据是用32个比特位来储存数据,也就是32个0,其中第一位数为符号位,大多数情况用来表示整数是正的还是负的,我们先从原码说起,1和-1的原码分别为:

正数的反码不变,负数的反码在其原码的基础上符号位不变,其他位按位取反(0变成1,1变成0),即:

 正数的补码还是不变,负数的补码在其反码的基础上加1:

 所以我们可以总结:正数的原码,反码和补码都相同,而负数的原码,反码和补码在转换时才会不同,计算机在储存整形时用的都是补码。

整形在内存中的存储:

   整形类型

我们知道C语言的整形类型有

我们知道char是字符类型,但是char类型储存字符的方式也是储存数字,然后在通过ascii码表转化为对应的字符,所以在这里我也将char当作是整形的一类了。

计算机会分配给不同类型不同的字节大小,也就是可以储存数字的大小:

 对于不同整形无符号的问题,我拿char举个栗子

char类型的最大值和最小值在计算机的存储:

10000000~011111111  10000000为-128(这是计算机规定的),111111111为-127,011111111为127,

所以大小范围是-128到127

而无符号char类型,就是将最后一位符号位变成计算大小的位,即:

00000000~111111111=00000000~01111111+2^8,也就是0到255

大端字节序和小端字节序

在这里我们引入一下内存单元的概念,内存单元代表的是一个字节空间,即8个比特位,计算机会给这个内存空间分配一个地址(其实就是指针)。

当我们创建一个int变量,并且给他赋一个16进制的值 0x11223344,那么计算机会给他连续开辟4个字节大小的空间,他会有4个内存单元,接下来11将会被放在第一个内存单元,22放在第二个内存单元,下面也是一样,那么计算机会怎么给这些内存单元分配地址呢?于是就产生了大端字节序和小端字节序。                                                                       

                                                                         ~两位16进制的范围大小等于8个比特位的范围大小 

大端字节序存储:高字节序的内容放在低地址,低字节序的内容放在高地址
小端字节序存储:高字节序的内容放在高地址,低字节序的内容放在低地址       

 其中:高字节序代表高位数,即11,低字节序代表低位数,

我们可以测试下自己的编译器是大端的还是小端的,


#include<stdio.h>
int main()
{
	int a = 0x11223344;
	char* p = (char*)&a;
	printf("%0x", *p);
	return 0;
}

如果运行的结果为44,则为小端,11为大端

浮点数在内存的储存

根据国际标准,任意一个二进制浮点数都可以表示成:

(-1)^S*M*2^E  

(-1)^s表示符号位,-1的s次幂要么是正数,要么是负数PM表示有效数字,M大于等于1,小于2;

2^E表示指数位。                            -----总的来说就是二进制的科学计数法

 

浮点数在内存的存储其实就是S,M和E的存储

单精度浮点型float:最高的一位是符号位s,接着的8位是指数E,剩下的23位为有效数字M

 其中,E的大小0~255

双精度浮点型double:最高的一位是符号位s,接着的11位是指数E,剩下的52位为有效数字M

 其中E的大小0~2047

———————————————————————————————————————————

M的存储:

因为1<=M<2,所以M肯定为1.xxxxxxx,所以标准规定在计算机存储M的时候,不储存第一位数字1,当读取的时候才加上1,这样做的目的是节省一位有效数字,使计算机保存更多其他有效数字。

———————————————————————————————————————————

E的存储:

首先,E在计算机的存储肯定是一个无符号整形,这就意味着,当E为11位,那它的大小范围是0~2047,当E是8位时,它的大小范围为0~255

但是我们知道,在科学计数法表数的示时,它的指数位是可以取负,所以科学家为了使得E表示负数,在将E存储前加上一个中间数字,8位的E的中间数位127,11位的E为1023,这样在读取的时候给E减去这个中间数,在计算的时候E就能当作负数带来计算了。、

E的特殊情况

当E全位0的时候,那么E的真实值位1-127(或者1-1023),接下来在计算的时候M不会再加1,因为E为全0的时候算出来的数是无限接近于0的数,所以干脆就不给M加1,便于表示+0和-0;

当E全为1的时候,如果有效数字全为0,表示+无穷或者-无穷

标签:存储,字节,浮点数,char,详解,内存,整形,原码
来源: https://blog.csdn.net/m0_62616069/article/details/121569495

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有