首先要说的是,二进制中关于一个负数,它的补码应该是本身按位取反加1就可以得到,这个公式学过数字电路的人都知道,但是为什么按位取反加1就可以得到这个负数的补码?可能很多人都不知道。
那么,我们就来搞清楚它!
要先入为主的引出一个概念,补码是什么?
补码:在二进制中为了保证两个相反数相加=0,提出来了一个补码的概念。
eg:(-1)+(1)=0;用二进制怎么表示这个等式呢?
(1001)+(0001)= 0 ,嗯?怎么好像不对啊? 加起来不等于0啊。
是的,加起来确实不等于0,那么这时候就要请补码 出场了,1001的补码是1111,
(1111)+(0001)=0 ;这下是不是正确了?
于是,在二进制中或者说在verilog中,我们用负数的补码来表示这个负数。
这里要说明另一个重要的概念:
计算机是不区分二进制数是“正”还是“负”的,二进制中一个数是正数还是负数完全取决于你主观认为这个数是正还是负!
eg:1001 我可以说这个数是9 也可以说这个数是-7。
接下来就来说为啥是按位取反再加1:
1111+0001=0
0- 一个正数 = 它的相反数
那在二进制中,正数的补码是本身.
0 — (一个数的补码)= 相反数的补码
=> 1111+0001 -(一个数的补码)= 相反数的补码
=> 1111 - (一个数的补码) +0001 = 相反数的补码
1111- (一个数的补码) 是啥? 不正是对这个数按位取反么
=> 按位取反+ 0001 = 相反数的补码
这不就得到这个公式了吗?