一般我们都知道用二进制表示负数的时候,有一个公式:补码=反码+1,但是其实我一直不明白为什么要搞什么补码,今天看了一篇文章,我觉得讲的很好,就是说为什么在计算机中负数要用补数表示。

模和补数

模指的就是一个范围,在这个范围内周而复始,例如时钟,时钟的模为12,也就是从0开始,到11,再往后又到0了。

假如现在时针指着3,那么我想调到5,那么要怎么做呢?

background Layer 1 顺时针走2格 逆时针走10格

很明显可以顺着调2格到5,或者反正调10格到5,也就是说这里的+2和-10是等效的。也就是说+2和-10互为补数。假如我们知道一个数为-10,模为12,很容易知道它的补数为2=12-10。

补码原理

因为加法器很容易实现,因此计算机里很多的计算都会变成加法,包括减法也会变成加法,因此我们要利用上面的模和补数的概念找到和一个负数相对应的补数。

一个字节里面有8位,也就是说模是2^8,二进制为100000000,我们举个例子,看看-3如何找到它对应的补数。

background Layer 1 用模去加-3: 100000000-00000011 (1+11111111)-00000011 1+(11111111-00000011) 1+11111100 11111101 -3的补码

因此在计算中-3就是用11111101表示,这个是可以参与计算的,例如5-3如下:

background Layer 1 5-3 0 + 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 0 0 0 0 0 1 0 0 2 =

那么假如我们知道了一个补码,如何求原码呢?我们根据补码前面是否有1开头,有1开的就是负数,假设这个数字为-x,那么我们用模去减:

background Layer 1 例如补码为11111000,我们假设原码为-x 我们用模去减它,结果为x: 100000000-11111000 (1+11111111)-11111000 1+(11111111-11111000) 1+00000111 00001000 原码为-8

好,我们知道了原码,补码,对于~操作符就很好理解了,它是按位取反,如下:

background Layer 1 2的二进制为00000010,~2则二进制按位取反: 11111101 这种一看就是一个负数的补码,我们用2^8去减 (1+11111111)-11111101 1+(11111111-11111101) 1+00000010 00000011 因此~2=-3

除了~操作符,需要特别注意~~操作符,这个操作符就是先取反,再取反回来,看起来没变,但是一般可以有两个功能:

1.可以把其他类型变成数字,例如~~undefined==0,这个和+不同,+可以转成数字,但是如果转不成,会变成NAN,例如+'123a'==NAN,但是~~不会,例如~~'123a'==0

2.可以去掉小数点,例如~~4.2==4

其他文章

0
我要评论

评论

返回
×

我要评论

回复:

昵称:(昵称不超过20个字)

图片:

提交
还可以输入500个字