python正负数存储方式
时间: 2025-03-06 18:49:19 AIGC 浏览: 48
### Python 中正负数的存储方式
#### 整数类型的内存表示
在 Python 中,整数类型 `int` 是一种用于表示整数值的数据类型。这种数据类型能够表示正数、负数以及零[^1]。
对于正整数和负整数,在计算机内部是以补码形式存储的。具体来说:
- **正整数**:其二进制表示即为其原码;
- **负整数**:先取该数绝对值的二进制表示作为原码,再对该原码按位求反得到反码,最后给反码加一获得补码。
然而,Python 的整数实现并不受限于机器字长,这意味着它可以动态调整所占用的空间以适应不同大小的数值需求。因此,Python 的整数实际上是由多个“数字单元”组成的对象结构,每个单元通常占据 30 或 15 个比特(取决于平台),这使得 Python 可以支持非常大的整数运算而不会溢出。
```python
import sys
positive_num = 10
negative_num = -5
print(f"Positive number {positive_num} occupies bytes: {sys.getsizeof(positive_num)}")
print(f"Negative number {negative_num} occupies bytes: {sys.getsizeof(negative_num)}")
```
上述代码展示了如何查询特定整数值实际占用多少字节空间。需要注意的是,这里的结果不仅包括真正用来保存数值的部分,还包括一些额外开销,如对象头信息等。
#### 浮点数类型的内存表示
浮点数则遵循 IEEE 754 标准进行编码,分为单精度 (`float`) 和双精度两种格式。标准定义了符号位 S (Sign bit),指数部分 E (Exponent bits) 和尾数 M (Mantissa/Fraction bits)[^2]。
- 符号位决定了这个数是正是负;如果为 0,则代表正值;如果是 1,则代表负值。
- 指数字段指定了基数的位置,并允许表达极大极小范围内的实数。
- 尾数提供了有效数字的信息,增加了数值精确度。
下面是一个简单的例子展示了一个具体的浮点数值及其对应的内存布局情况:
```python
from struct import pack, unpack
value = 111000.111
binary_representation = ''.join(format(byte, '08b') for byte in pack('d', value))
sign_bit = binary_representation[0]
exponent_bits = binary_representation[1:12]
mantissa_bits = binary_representation[12:]
print(f"Value as float type is printed as follows:")
print(value)
print("\nBinary representation of the floating point number:")
print(binary_representation)
# Output sign, exponent and mantissa separately.
print(f"\nSign Bit ({len(sign_bit)}) : {sign_bit}")
print(f"Exponent Bits ({len(exponent_bits)}) : {exponent_bits}")
print(f"Mantissa Bits ({len(mantissa_bits)}) : {mantissa_bits[:16]}...{mantissa_bits[-16:]}\n") # Only showing first and last few digits due to length.
# Verify using built-in functions that this indeed represents our original value correctly.
reconstructed_value = (-1)**int(sign_bit)*2**(int(exponent_bits, 2)-1023)*(1+sum(int(bit)*2**(-i-1)for i,bit in enumerate(mantissa_bits)))
print(f"The reconstructed value from its components matches closely with the initial one:\nOriginal Value={value}, Reconstructed Value≈{round(reconstructed_value,9)}\nDifference≈{(abs(value-reconstructed_value)):.9g}")
```
此脚本通过转换成二进制串并解析各个组成部分来直观地理解浮点数是如何被编码到内存中的。同时验证了重建后的近似值确实接近原始输入值。
阅读全文
相关推荐



















