-
-
理解补码,我用另外一种脑回路
-
2020-12-25 18:00
5538
-
今天突然想求个补码,但不记得取反后应该+1,还是-1了,于是搜到这篇文章:https://blog.csdn.net/wenxinwukui234/article/details/42119265
有些人学东西,主要靠记忆,而有些人主要靠理解,有些人两个方面都很强。我猜这位博主,主要靠理解,要不然不可能对记住"取反加一"四个字,这么没自信,哈哈哈!这其实很正常,比如我就记不得是加1,还是减1了,上完小学后,记忆力一直在退化,以至于初中高中从来不背诗,英语也学不好,导致工作后为学英语花了好多钱,但也还是个渣渣!
这篇文章写的很有意思,提出了补码的本质作用:为了让+M和-M的二进制,经过加法器运算得到的是0。而且看得出来,博主喜欢用数学的思维想问题,我也津津有味的看完了,同时也发现一种更容易理解的方法。
假设+M的补码为:xxxxxxxx, -M的补码为:yyyyyyyy,那么它们相加要等于0才行:
xxxx xxxx
+ yyyy yyyy
--------------
0000 0000
先不要认为xxxxxxxx和yyyyyyyy互补,而是互为相反数,那么:
xxxx xxxx
+ yyyy yyyy
--------------
1111 1111
推导出:
(xxxxxxxx+1) + yyyyyyyy = 0
xxxxxxxx + (yyyyyyyy+1) = 0
也就是说,不管对于xxxxxxxx还是yyyyyyyy,加上它们的(反码+1),就可以等于0。
我的思路跟这位博主的出发点是反的,然后0的补码为什么还是0,以及char类型中,-128不存在+128跟它补的原因,就清楚了:
0 -> 反码: 11111111 -> 加1得到补码:100000000,最高位溢出,结果仍为0
-128 -> 反码:01111111 -> 加1得到补码: 10000000,符号位为1,结果仍为-128
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界