对于一个 n bits 2’s 补码:
简单来看,一个4 bit 的 2‘s 补码:
2‘s 补码在 min/max 处溢出时:
只要最终预算的结果不超过[min,max],中间可以利用这种卷绕性质,节省资源。
7 + 7 - 5 - 4 = 5 这个过程用 3bits 补码去处理,虽然中间有溢出,但是最终结果仍然时正确的:
那么如何理解这个性质呢?
其实无论求和的部分有多大,减去的总数有多大,只要在这个[min, max]的范围内,结果就是正确的。想象有2个人绕着操场跑圈,正着跑,跑到+7, 下一步就会到 -8了,相当于加法的过程;负着跑,跑到-8,下一步就会到 +7了,相当于减法的过程。如果两个人,一个人叫被减数,另外一个人叫减数,我们不在乎这两个人分别跑了多远,我们只在乎他俩的相对值,只要相对值在 [-min,max] 范围内,那这样计算的结果就一定是正确的。
在数字电路中,2’s补码自带这种性质。但是在matlab中,我们更多处理的是十进制的数据,其实这里的十进制数据也是有限大的,比如INT64,能够表示数的范围是
为了利用卷绕性质,对于一个nbit 2’s补码,在十进制中的对应可以是: