2023-12-25 补码(懒人版)

前言

倘若你看过教材上的补码,那么一定可以发现一些正常人/计算机难以理解的操作:
请添加图片描述

  • 我是计算机,我求个补码还要把最高位不变,其他位置求反,然后再加1,这个过程中最高位还不能让进位覆盖了
  • 我是人,光看int型的大小并不足以判断溢出后是否正确,还要把真实的结果得到后,才知道计算机溢出是否产生了正确的结果

摘要

诚然,这么绕自然有绕的理由,但本文的目的是给出懒人版的不绕的“懒人”码。
并且,可以快速解答一些像0xffffffff+0xffffffff到底会不会溢出这样的问题。
同时,如果你喜欢权威的解答和大部分人学到的答案,请关闭本贴。

“模数系”

计算机眼中的数系既不是人类视角的实数系,也不是理想化的整数系和自然数系,而是一个永远有上界的模数系。也就是说,在32位的int型看来,4294967297≡1。

时钟的比喻

一个12小时制的时钟可以这样定义:

表一

|数字|代表的含义|
|-|-|-|
|1|将指针顺时针拨动一格|
|2|将指针顺时针拨动两格|
|3|将指针顺时针拨动三格|
|4|将指针顺时针拨动四格|
|5|将指针顺时针拨动五格|
|6|将指针顺时针拨动六格|
|7|将指针顺时针拨动七格|
|8|将指针顺时针拨动八格|
|9|将指针顺时针拨动九格|
|10|将指针顺时针拨动十格|
|11|将指针顺时针拨动十一格|
|12|将指针顺时针拨动十二格|

聪明的读者肯定发现了,虽然日常生活中我们从不关心表格的第二列,但是在理解计算机表示数时,第二列显得格外重要,而且它其实并不唯一。例如:

表二

| 数字 | 代表的含义 |
| - | - | - |
|1|将指针顺时针拨动一格|
|2|将指针顺时针拨动两格|
|3|将指针顺时针拨动三格|
|4|将指针顺时针拨动四格|
|5|将指针顺时针拨动五格|
|6|将指针逆时针拨动六格|
|7|将指针逆时针拨动五格|
|8|将指针逆时针拨动四格|
|9|将指针逆时针拨动三格|
|10|将指针逆时针拨动两格|
|11|将指针逆时针拨动一格|
|12|将指针顺时针拨动零格|

ps:由于计算机一般使用二进制编码,这是一种有权编码,也就是说,除非有一种办法可以方便的将0映射为4294967296,否则上表中的12一般都写作0。但是12在数学上是可行的,写成0只是利用有权码的方便性。

表二将12写成0后,实际上已经是计算机表示有符号整数的方法;表一将12写成0后,实际上已经是计算机表示无符号整数的方法。

抛弃原码或者抛弃最高位

  • 为什么取反+1这么难以理解?在上面的时钟看来,-1就是等于11的,这是自然而然的、不需要证明的。因为原码这个东西在计算机看来从来就不存在,原码这个东西才是一种“伪码”。所有的复杂操作实际上都是在迁就原码。

如果没有原码,我怎么方便的计算-1的补码呢?这还不简单,直接写0xffffffff就行了啊。其他的依次-1即可,这样做的好处是不用求反+1,而且熟练之后很快。

倘若你不想否定原码,也可以将1的二进制代码求反+1,就是0xffffffff。这样做的好处是可以让你求反+1没有白学,而且多了一种验算的手段。这样做的原理和模数以及你对补码的理解深度没有任何关系,只是二进制数最大值是0xffffffff+1的应用罢了

  • 所以我们的懒人码是一种抛弃了原码的补码,不用原码自然就不用取反+1。正数只有一种懒人码,就是它的二进制数;负数也只有一种懒人码,也就是它的值加上模数后的二进制数。

  • 懒人码的加减法就直接加减。按位加减。

溢出处理

懒人码的几何意义是这样的:最高位是0时,顺时针旋转;最高位是1时,逆时针旋转。

所以0xffffffff+0xffffffff到底会不会溢出?显然不会,这就相当于指针逆时针转了一度,再转了一度。

什么情况下会溢出,一堆数相加,只要知道它们的和超过2147483647或者低于-2147483648就会溢出。那么,如果先溢出了,然后又回到了不溢出的部分,到底结果正不正确呢?

如果你只知道补码,有可能你不能立刻回答。但是看了上述部分,就知道并不会不正确。因为转了99998度又转回去99998度答案并不会变。

做题实战

  1. 求-3的补码?
  • 懒人码法一:-3加模数8等于5,5的二进制数是101.
  • 懒人码法二:-3原来是011,求反+1是101
  1. 求-3-8的补码运算?
  • 第一步:-3加模数32等于29,29的二进制数是11101;
  • 第二步:-8加模数32是24,24的二进制数是11000;
  • 验证:-3加-8不会超过-16,不会溢出,耶!
  • 加起来:10101,二进制值21,实际上减掉32等于-11,正确

补充

你肯定发现了,懒人码就是补码,但是因为它是我起的名字,所以支持了很多补码类不支持的高端方法。不仅求解方便好记,而且几何意义明确。尤其在模数小(例如16,32)时做题快;在模数大时(如4294967296),可以仿照真正的计算机计算,不用受课本保留最高位,求反加一,最高位不能覆盖balabala的限制。

  • 23
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值