two's complement
About to read computer science, I have just stumbled accross the concept of "Two's complement". I understand how to apply the "algorithm" to calculate these on paper, but I have not yet obtained an understanding of why it works. I think this site: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html provides an explanaition why "flipping the digits" and adding one produces the compliment. What I do not understand is why adding the complement is equivalent to substracting the original number. Could somebody please give an explanation (maybe with a decimal example of the same concept as well?)?
Many thanks!
----------------------------------------------------------------------------
I'll stick to 8-bit quantities, but the same applies in general.
The key to understanding two's complement is to note that we have a set of finitely many (in particular, 2828) values in which there is a sensible notion of addition by 11 that allows us to cycle through all of the numbers. In particular, we have a system of modular arithmetic, in this case modulo 28=25628=256.
Intuitively, arithmetic modulo nn is a system of addition (and subtraction) in which overflow and underflow cause you to "cycle back" to a value from 00 to n−1n−1. A classic example is the usual "clock arithmetic", which is to say arithmetic modulo 1212.
For example, if it is 11:0011:00 now, then three hours later it will be 2:002:00, since
and similarly, if it is 1:001:00, then 44 hours ago it was 99 since
Notice that subtracting 44 hours on the clock is the same as adding 12−4=812−4=8 hours. In particular, we could have computed the above as follows:
That is: when performing arithmetic modulo nn, we can subtract xx by adding n−xn−x.
Now, let's apply this idea modulo 256256. How do you subtract 33? Well, by the above logic, this is the same as adding 256−3=253256−3=253. In terms of binary, we say that subtracting 0000001100000011 is the same as adding
and there's your two's complement.
Notably, we don't think of 11111011111101 as being 253253 in our 88-bit system, we instead consider it to represent the number −3−3. Rather than having our numbers go from 00 to 255255 around a clock, we have them go from −128−128 to 127127, where −x−x occupies the same spot that n−xn−x would occupy for values of xx from 11 to 128128.
Note: an interesting infinite analog to the two's complement system of subtraction is that of infinite series 2-adic numbers. In particular, we can say something strange like
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2018-03-22 chrome 的onbeforeunload事件没有触发
2017-03-22 css中高度比img多出4px的问题
2016-03-22 linux commands ---2 ,学习vim编辑器如何使用的方法。
2016-03-22 linux command ---1