一个对原码、反码、补码的简单理解

前言

        在说原码、反码、补码前先对两个定义有一个简单的认识。

        机器数:一个数在计算机中的二进制表示形式。一个字节为八位及1byte=1bit,第一位为符号位,剩下七位为数字位,在符号位上,0表示正数,1表示负数。

        真数:由于机器数是一位表示符号剩余七位表示数字,所以就和8位二进制数产生了区别,而真数则表示的就是机器数的实际值。

【举个例子】

        [1000 0001]

        从二进制的转化上他的值为129

        从机器数的角度上他的实际值为-1

        所以-1就是【1000 0001】机器数的真数

原码、反码、补码的认识与转化

        原码、反码、补码是机器存储一个具体数据的编译方式

原码

        原码的第一位为符号位,剩余七位为数字位由真数的绝对值来表示。

反码

        正数的反码是其原码本身。

        负数的反码为符号位不变,其余各个位取反。

【举个例子】

        原码 [1000 0001]

        其反码为 [1111 1110]

补码

        正数的补码是其原码本身。

        负数的补码是在其反码的基础上+1

        特殊的-128只有补码(其补码为[1000 000])没有原码和反码。

【举个例子】

        原码 [1000 0001]

        其反码为 [1111 1110]

        补码为 [1111 1111]


        这是一个对原码、反码、补码的简单理解,没有对其进行深入的探究,如果理解有所偏差,请大家辛苦斧正。

以下是一个输出整数原码反码补码的例子: ```python num = -18 bits = num.bit_length() + 1 print("原码:", bin(num & ((1 << bits) - 1))) print("反码:", bin(num & ((1 << bits) - 1) ^ ((1 << bits) - 1))) print("补码:", bin(num & ((1 << bits) - 1) ^ ((1 << bits) - 1) - 1)) ``` 输出结果为: ``` 原码: -0b10010 反码: -0b10011 补码: -0b10010 ``` 其中,`num.bit_length()`用于获取`num`的二进制表示的位数,`bits`为二进制表示的位数加1,`1 << bits`为一个二进制数,其最高位为1,其余位为0,表示一个比`num`的二进制表示的位数多1的二进制数。`((1 << bits) - 1)`为一个二进制数,其所有位都为1,表示一个比`num`的二进制表示的位数多1的全1二进制数。`num & ((1 << bits) - 1)`用于将`num`的二进制表示截取为`bits`位,即去掉多余的高位。`((1 << bits) - 1) ^ ((1 << bits) - 1)`为一个二进制数,其所有位都为0,表示一个比`num`的二进制表示的位数多1的全0二进制数。`num & ((1 << bits) - 1) ^ ((1 << bits) - 1)`用于将`num`的二进制表示的符号位取反,即将其变为反码。`((1 << bits) - 1) ^ ((1 << bits) - 1) - 1`为一个二进制数,其最高位为0,其余位为1,表示一个比`num`的二进制表示的位数多1的全1二进制数减1,即一个比`num`的二进制表示的位数多1的全1二进制数的补码。`num & ((1 << bits) - 1) ^ ((1 << bits) - 1) - 1`用于将`num`的二进制表示的符号位取反并加1,即将其变为补码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值