整形和浮点在内存中是怎么存储的

本文介绍了计算机内存中整形数的存储方式,包括无符号数和有符号数的补码表示法,以及源码到补码的转换。同时阐述了大小端存储的概念,即低位和高位字节在内存中的位置差异。此外,还详细解析了浮点数在内存中的存储结构,以单精度和双精度浮点数为例,解释了符号位、指数和尾数的分布。

1.整形的存储:
首先大家应该都知道内存中存放的是补码,我们人一般看到的是二进制源码,机器会将二进制源码转化为补码存放在内存中进行计算。为了能高效的运算,CPU只能无脑的进行加法运算,可以将减法理解为加一个负数,乘法为多个相同数相加等等。这就需要我们区别正负数,对于无符号数(unsigned)系列,最高比特位为0表示正数,1表示负数。
源码变补码:
无符号数,原码,反码,补码相同。
有符号数,符号位(1或0)不变 ,其他未按位取反,结果加1既是补码;
补码变源码:
无符号数,原码,反码,补码相同。
有符号数,补码取反结果加1既是源码。相当于源码变补码的逆过程。
各种数据类型的长度
类型的意义:1.使用这个类型是开辟多大的空间(存放时开辟空间)。
2.如何看待内存空间的视角(读取的时候需要看类型读取一定长度字节)。

关于大小端存储:
小端存储:低字节(低位)存储在低地址,高字节存储在高地址。
大端存储:低字节(低位)存储在高地址,高字节存储在低地址。

2.浮点在内存中的存储
eg:十进制的5.0可表示为二进制的101.0 , 相当于1.01x2^2
单精度浮点数:占四字节(32bit位);其中最高bit位表符号位,接下来8个比特位表示权重即上边^2,最后23个比特位存放小数点后面的数字,即上边的1.01中的01。
双精度浮点数:占八字节(32bit位);其中最高bit位表符号位,接下来11个比特位表示权重,最后52个比特位存放小数点后面的数字.

### 如何在编程语言中正确比较整浮点数值 在编程语言中,整浮点数据的比较需要特别注意精度问题。由于浮点数在计算机中无法精确表示某些值(例如 0.1),直接使用等号进行比较可能会导致意外的结果[^1]。 以下是一些通用的方法来正确比较整浮点数据: #### 1. 使用误差范围比较浮点数 对于浮点数的比较,通常不建议直接使用等号(`==`)。相反,可以定义一个很小的误差范围(称为 **epsilon**),并在该范围内判断两个浮点数是否相等。代码示例如下: ```python def are_floats_equal(a, b, epsilon=1e-9): return abs(a - b) < epsilon # 示例 a = 0.1 + 0.2 b = 0.3 if are_floats_equal(a, b): print("浮点数相等") else: print("浮点数不相等") ``` 这种方法的核心在于引入了一个可接受的误差范围 `epsilon`,以避免因浮点数精度问题导致错误结果[^1]。 #### 2. 转换为整后比较 如果浮点数的实际值可以转换为整而不会丢失精度,可以通过将浮点数放大后再转换为整进行比较。例如: ```python def compare_int_and_float(i, f): factor = 1000000 # 根据浮点数精度选择合适的倍数 return int(f * factor) == i * factor # 示例 i = 1 f = 1.0000001 if compare_int_and_float(i, f): print("整浮点相等") else: print("整浮点不相等") ``` 此方法适用于浮点数的精度范围已知且有限的情况。但需要注意的是,如果浮点数的精度超出了整的表示范围,则可能导致溢出或错误结果[^4]。 #### 3. 利用语言内置函数 某些编程语言提供了专门用于处理浮点数比较的函数。例如,在 Python 中可以使用 `math.isclose` 方法: ```python import math a = 0.1 + 0.2 b = 0.3 if math.isclose(a, b, rel_tol=1e-9): print("浮点数相等") else: print("浮点数不相等") ``` `math.isclose` 函数允许指定相对误差(`rel_tol`)绝对误差(`abs_tol`),从而更灵活地控制比较的精度[^1]。 #### 4. 注意内存存储差异 整浮点内存中的存储方式不同。整是以二进制形式直接存储其值,而浮点则按照 IEEE 754 标准存储为符号位、指数位尾数位[^2]。因此,在比较时需考虑浮点数的舍入误差及其对结果的影响。 ### 总结 在编程中正确比较整浮点数据的关键在于理解浮点数的精度限制,并采取适当的措施来规避这些问题。常见的方法包括使用误差范围、转换为整以及利用语言内置的比较函数[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值