整数的补码,原码, 反码

//解释1

补码
用[x]表示机器数(原码),x是真值(二进制)
            x=+0.1001,则[x]原=0.1001
   x=-0.1001,则[x]原=1.1001

对于0,原码中有“+0”、“-0”之分,故有两种形式:
                [+0]原=0.000...0
                [-0]原=1.000...0

采用原码表示法简单易懂,但它的最大缺点是加法运算复杂。这是因为,当两数相加时,如果是同号则数值相加;如果是异号,则要进行减法。而在进行减法时还要比较绝对值的大小,然后大数减去小数,最后还要给结果选择符号。

为了解决这些矛盾,人们找到了补码表示法。机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。

负数用补码表示时,可以把减法转化为加法。这样,在计算机中实现起来就比较方便
[x]补=   {     x       1>x≥0  
                  {     2+x=2-|x| 0≥x≥-1

            x=+0.1011,则[x]补=0.1011
   x=-0.1011,则[x]补=10+x=10.0000-0.1011=1.0101

对于0,[+0]补=[-0]补=0.0000                                  (mod   2)

例子中是以定点小数为例。

补码的原理可以用钟表来描述

如设标准时间为4点正;一只表已经7点了,为了校准时间,可以采用两种方法:一是将时针退   7-4=3   格;一是将时针向前拨12-3=9格。即7-3和7+9(mod12)等价,因此,把负数用补码表示的mod2操作,可以把减法转化为加法。

 

//解释2

所有的负数的反码等于原码各位取反;补码等于反码加一.   十六进制也是先化成2进制的在化补码。   补码的用途是让机器学会减法运算的。应为所有的处理器是电路做的,电路其实只是加法器,只能做加法。如何能让电脑做减法呢,就用补码啊。减去一个数就等于加上她的补码。于是减法就转换为机器能执行的加法了,于是电脑就能算减法了啊
负数用补码表示时,可以把减法转化为加法。这样,在计算机中实现起来就比较方便
[x]补=   {     x       1>x≥0  
                  {     2+x=2-|x| 0≥x≥-1

            x=+0.1011,则[x]补=0.1011
   x=-0.1011,则[x]补=10+x=10.0000-0.1011=1.0101

### 补码原码反码的概念 #### 原码 原码是最直观的表示方法,最高位作为符号位,0代表正数,1代表负数。数值部分直接采用二进制表示法[^2]。 例如: - 正数 `+5` 的8位原码为 `00000101` - 负数 `-5` 的8位原码为 `10000101` #### 反码 对于正数而言,其反码与其原码相同;而对于负数,则是在保留符号位的前提下对其余各位取反得到反码[^1]。 举例来说: - 正数 `+5` 的8位反码仍为 `00000101` - 负数 `-5` 的8位反码则变为 `11111010` 值得注意的是,在某些旧系统中确实存在使用反码的情况,但由于其实现复杂度较高以及处理零值时可能出现两个不同编码的问题(即正零和负零),因此现代计算机普遍不再单独应用反码而转向更为高效的补码体系[^3]。 #### 补码 为了克服上述提到的反码存在的缺陷并简化硬件设计,引入了补码概念。具体地讲: - 对于正数,其补码同样等于自身的原码; - 对于负数,先求得该数绝对值对应的二进制形式再按位取反最后加一即可获得最终结果。 继续以上述例子说明: - 正数 `+5` 的8位补码依旧是 `00000101` - 而对于 `-5` ,首先写出 `|−5|=5` 的8位二进制表达 `00000101` ,接着将其逐位置否变成 `11111010` 后再加上一位形成 `11111011` 即为其8位补码表示[^4]。 通过这种方式定义的数据表示方案不仅解决了同一个整型数据可能存在多种机器级描述这一潜在隐患,而且使得算术运算更加便捷高效,特别是在涉及减法规程转换成加法操作方面具有明显优势。 ```python def get_complement(value, bit_length=8): """获取给定十进制整数value在指定bit长度下的补码""" if value >= 0: return format(value, '0{}b'.format(bit_length)) else: abs_value = abs(value) binary_str = ''.join(['1' if b == '0' else '0' for b in bin(abs_value)[2:].zfill(bit_length)]) inverted_int = int(binary_str, 2) + 1 return format(inverted_int % (1 << bit_length), '0{}b'.format(bit_length)) print(get_complement(-5)) # 输出:11111011 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值