正负数在计算机中的存储方式

本文介绍了计算机中正负数的存储方式,包括原码、反码和补码的概念。原码直接表示符号,反码在原码基础上符号位不变其余位取反,而补码解决了正负0的唯一表示和减法运算的问题。通过补码,计算机可以仅使用加法完成所有运算,简化了设计并扩大了表示范围。

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

1. 原码,反码,补码的基础概念和计算方法

原码,反码,补码只是计算机存储数字的一种方式。

1. 原码

原码就是用第一位表示符号位,其余位表示值,比如8位的二进制数:

[+1]原 = 0000 0001
[-1]原 = 1000 0001

因为第一位为符号位,所以8位二进制数的取值范围为:

[1111 1111 , 0111 1111][-127,+127]

2. 反码

反码是在原码的基础上符号位不变,其余的位数取反,比如:

[+3]原 = 0000 0011原 = 0111 1100反
[-3]原 = 1000 0011原 = 1111 1100反

3. 补码

正数的补码为它本身,比如:

[+3]原 = 0000 0011原 = 0000 0011补

负数的补码为其反码+1

[-3]原 = 1000 0011原 = 1111 1100反 = 1111 1101补

### 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}") ``` 此脚本通过转换成二进制串并解析各个组成部分来直观地理解浮点数是如何被编码到内存中的。同时验证了重建后的近似值确实接近原始输入值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值