数据在内存中的存储(原,反,补码,浮点数的存储细节及存储规定)

本文深入探讨了整形在内存中的原、反、补码表示,大小端差异,以及浮点数的存储规则、中间值调整和特殊规定。通过实例解析了两者在存储上的关键点,并揭示了它们之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

  • 一、数据分类
  • 二、整形在内存中的存储
    • 1.原,反,补码。
    • 2.大小端。
  • 三,浮点型在内存中的存储
  •       1.存储规则
  •        2.存储规定
  •        3.例子

一、数据类型分类

类型的意义:

                     使用这个类型开辟内存空间的大小 (大小决定了使用范围)。

整形家族:

               char    short        int          long (都包括unsigned signed)

               对char是整形家族是否感到诧异?

                                                               ——字符本质是ASCII码值,是整形。

浮点数家族:

             float      double 

结构类型:

                数组类型         结构体类型(struct)    枚举类型(enum)     联合类型(union)

指针类型:

              int *pi;  char*pi; float*pi

          void *pv——具有泛型,可以接受任意类型的地址,但void型指针不能直接解引用,也不                                      能 void*(pv + || - 整数)。

空类型:

             void表示空类型(无类型)——通常运用函数的返回类型,函数的参数,指针的类型。


二、整形在内存的存储

2.1.原,反,补码

整数的三种的表示方法都有符号位和数值位,符号位是第一位,用0表示正,用1表示负。

无符号的都当作正整数,数值位正数的原 反 补码相同。

负整数

           原码——按着正负数的形式翻译成二进制。

           反码——符号位不变,其余按位取反。

           补码——反码加一。

 补码取反加一也可以得到原码哟!!!

对于整形来说:数据存放内存中其实存放的是补码。

2.2大小端

9b1d13f819ef4411b358d400ea07acf5.png

 为啥20在内存应该显示是00 00 00 14,可最后显示的是14 00 00 00?

那是因为大小端的原因。

大端:

        是指数据的低地位保存在内存的高地址中,而数据的高地址保存在内存的低地址中。

小端:

     是指数据的低地位保存在内存的低地址中,而数据的高地址保存在内存的高地址中。

      ——大反小同

所以你知道为啥了吗?

f59d55bd2bc64736bd61d9d839a4919c.png


那你想知道你自己的电脑存储是大端存储还是小端存储?

8ab8c0d60a814564acf34c3ca798d064.png

 

 


三、浮点数在内存的存储

3.1.存储规则

整数在内存的存储形式是反码,那浮点数呢?

758985695f8545d2af2d1b4e59d227c9.png

 那是因为浮点数在内存的存储的形式不是反码。

任意一个二进制浮点数v可以表示成下面的形式:

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

                             ——(-1)^S 表示符号位,S=0,v为正数,当S=-1,v为负数。

                             ——M表示有效数字,大于等于1,小于等于2。

                             ——2^E表示指数位。

是不是有点懵逼了? 别急,别急,那就举例子说明一下。

十进制的5.0,写成二进制是101.0,(别忘记了,小数点后面是二的负几次方)相当于(-1)^0*1.01*2^2。几次方可以类比十进制。


3.2.存储规定

e84a17a2da184a4282f7157c98d7eea9.png

 我的图都好丑啊,丑萌萌的。

特别规定:

              M只保留小数点后面的位。(读取的时候要把第一位的1加上)

             指数E 如果是一个无符号整数,E要加上中间值(float的中间值是127,double的中间值是1023)。 

                     E不全为0或不全为1,读数时即指数E的计算值减去中间值,再将有效数字M前加上第一位的1。 

                     E全为0,读数时,指数E等于1减去中间值,有效数字M不再加上第一位的1。这样是还原0.0000……小数,无限接近0。


四、浮点数与整形存储差异举例346146d8add04b2aa968f646c98a0876.png

dfbb1c84999a4119a2650de0970e3429.png

 

 

 

### 数据内存中的存储方式 数据内存中的存储涉及多种技术和方案,具体取决于数据类型的性质以及编程语言的设计。以下是关于数据如何主要存储内存中的详细说明: #### 整型数据存储 整型数据通常以二进制补码的形式存储内存中。不同的整型类型(如 `short`、`int` 和 `long`)占用的字节数量不同,这决定了它们能够表示的数值范围[^1]。 ```c #include <stdio.h> int main() { int num = -1; printf("%d\n", *(char*)&num); // 输出最低有效字节的内容 return 0; } ``` 上述代码展示了通过指针访问整型变量的部分字节内容,揭示了整型数据的具体存储细节。 #### 浮点型数据存储 浮点型数据遵循 IEEE 754 标准进行存储,分为单精度 (`float`) 和双精度 (`double`) 类型。这些数据由符号位、阶码部分和尾数部分组成,允许表示非常大或非常小的数值[^4]。 ```python import struct def float_to_binary(f): packed = struct.pack('!f', f) # 将浮点数打包为字节序列 binary_str = ''.join(format(byte, '08b') for byte in packed) return binary_str print(float_to_binary(3.14)) # 转换并显示浮点数的二进制表示 ``` 此 Python 示例演示了如何将浮点数转换为其底层的二进制表示形式。 #### Java 中的数据存储 Java 的数据类型具有严格的定义,并依赖 JVM 来管理内存分配。无论是基本数据类型还是对象引用,都按照特定规则存放在堆栈或堆区中。由于 JVM 提供跨平台支持,相同的数据结构会在任何平台上保持一致的行为[^3]。 #### 长整型 (Long Integer) 存储 长整型可以是有符号或无符号的,分别对应于正负值的支持与否。例如 C/C++ 中的 `long int` 或者更高层次的语言如 Python 中动态扩展长度的大整数实现[^5]。 ```cpp unsigned long ulValue = 4294967295UL; // 使用无符号长整型的最大值作为例子 printf("Unsigned Long Value: %lu\n", ulValue); ``` 以上片段体现了无符号长整型的实际应用及其最大可能取值情况。 #### 错误实践警告 需要注意的是,试图以一种数据类型读写另一种类型所占有的内存区域可能导致未定义行为,比如用整型格式符打印浮点数就会引发截断等问题[^2]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值