数据在内存中的储存

目录

一.数据类型

1.1整数类型:

1.2浮点类型:

1.3字符类型:

用于表示单个字符,如 char。1.4布尔类型:

1.5 数据的取值范围:

二.原码,反码,补码,

2.1原码

2.2反码

2.3补码

 三.大端与小端

3.1大端:

3.2小端:

3.3判断大小端

四. 浮点数在内存中的存储

4.1举例:

4.2指数E从内存中取出还可以再分成三种情况:


一.数据类型

1.1整数类型:

用于表示没有小数部分的数值。根据取值范围的不同,整数类型可以分为多种,如 short、int、long 等。

1.2浮点类型:

用于表示有小数部分的数值。常见的浮点数类型有 float 和 double

1.3字符类型:

用于表示单个字符,如 char。
1.4布尔类型:

用于表示逻辑值,只有 true 和 false 两种取值。

1.5 数据的取值范围:

有符号位(以char为例)

 
       1 0 0 0 0 0 0 0  -128 (只有符号位为1)  
       1 0 0 0 0 0 0 1  -127  
       ...      
       1 1 1 1 1 1 1 0    -2  
       1 1 1 1 1 1 1 1    -1 (所有位都为1)  
   
       0 0 0 0 0 0 0 0     0 (所有位都为0)  
       0 0 0 0 0 0 0 1     1  
       ...              
       0 1 1 1 1 1 1 0    126  
       0 1 1 1 1 1 1 1    127 (所有位除了符号位都为1)

由此可知在有符号位是char可存放的值为:-128~127 

无符号

       0 0 0 0 0 0 0 0     0 (所有位都为0)  
       0 0 0 0 0 0 0 1     1  
        ...         
       0 1 1 1 1 1 1 0    254  
       0 1 1 1 1 1 1 1    255 (所有位都为1)

无符号位可以存储的值位:0~255

二.整形在内存的存储

二.原码,反码,补码,

2.1原码

原码是最直接的表示方法。
最高位表示符号位(0表示正数,1表示负数)。
其余位表示数值的绝对值。
例如:   +5的原码是00000101,

           -5的原码是10000101(假设是8位二进制数)

2.2反码

为了解决原码的加法和减法问题,引入了反码表示。
正数的反码与其原码相同。
负数的反码是将其原码的每位取反(0变1,1变0)。
例如;  +5的反码是00000101,

           -5的反码是11111010(假设是8位二进制数)。

2.3补码

为了彻底解决加法和表示问题,引入了补码表示。
正数的补码与其原码相同。
负数的补码是将其反码加1
例如:+5的补码是00000101,

           -5的补码是11111011(假设是8位二进制数)。
补码不仅解决了加法问题,还能够自然处理负数的表示和溢出问题。

在内存中是以补码的形式存放的。

 三.大端与小端

3.1大端:

在大端字节序中,最高有效字节存储在最低的内存地址处,而最低有效字节存储在最高的内存地址处。这类似于我们阅读多位数字时的顺序,先读最高位。

3.2小端:

在小端字节序中,情况正好相反。最低有效字节存储在最低的内存地址处,而最高有效字节存储在最高的内存地址处。这类似于我们阅读多位数字时的顺序,先读最低位。

例如:int a=0x11223344

6d1ad8b751f84a1ebe7da2eec81ef058.png

3.3判断大小端

代码判断:

#include <stdio.h>  

int check_endian() 
{
    int a = 1;
    char* c = (char*)&a;
    return *c; // 返回最低地址处的字节值  
}

int main() 
{
    int a = check_endian();
    if (a == 1) 
    {
        printf("该机器为小端\n");
    }
    else 
    {
        printf("该机器为大端\n");
    }
    return 0;
}

内存观察 

d0ada7e852ea4a94acd29f8c83e1e83c.png

四. 浮点数在内存中的存储

浮点数(如 float 和 double)在内存中的存储通常遵循IEEE 754标准,这是一个广泛使用的浮点数表示法。IEEE 754标准定义了浮点数的表示方式。

0159a3b46e8a417ba71a09afec3f3c0c.png

4.1举例:

假设我们要存储数字5.0:

⼗进制的5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2 。
那么,按照上⾯V的格式,可以得出S=0,M=1.01,E=2。
⼗进制的-5.0,写成⼆进制是 -101.0 ,相当于 -1.01×2^2 。那么,S=1,M=1.01,E=2。
IEEE 754规定:
对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M

 b7cb54752b184f419ba78b949a5bc2c2.png

对于64位浮点数,最高位的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M

18c46af751014ddba1427faa7ba6dd5f.png

符号位(S):最高位表示符号,0表示正数,1表示负数。

指数位(E):对于单精度浮点数(float),接下来的8位用于表示指数。但是,这8位并不直接存储指数值,而是存储了一个偏移量之后的值。对于float,偏移量是127(即 2^(8-1) - 1)。

尾数位(M):剩下的23位用于存储尾数的有效数字部分。但这里需要注意的是,IEEE 754标准规定了一个隐含的位,该位始终为1(除非数字是特别小的非规格化数),因此它不需要在内存中显式存储。

4.2指数E从内存中取出还可以再分成三种情况:

E不全为0且不全为1:
在这种情况下,指数E是一个正常的数,我们使用偏移量来计算实际的指数值。对于单精度浮点数(float),偏移量是127;对于双精度浮点数(double),偏移量是1023。因此,实际的指数值 = E - 偏移量。


E全为0:
表示那些非常接近0但又非零的数。
对于单精度浮点数,实际的指数值 = 1 - 偏移量 = 1 - 127 = -126。
尾数M的值不再加上隐含的1,而是直接使用存储的尾数值(即0.M)。
这种表示法允许浮点数有更大的范围来表示接近0的数。


E全为1:
在这种情况下,浮点数的表示有两种特殊情况:
如果尾数M全为0,那么浮点数的值表示为正无穷大(如果符号位S为0)或负无穷大(如果符号位S为1)。
如果尾数M不为全0,那么浮点数的值表示为“不是一个数”(NaN,Not a Number)。NaN用于表示无法表示或未定义的结果,如0除以0。

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值