1、有符号数与无符号数的区别
有符号数和无符号数都是人为定义的,有符号数比无符号数多了一个符号位(左边第一位),符号位表示为1为负,0为正;如10011,假如定义为无符号数,那么它就是19,假如定义为有符号数,那么它就是-3。
2、原码,反码,补码的区别
反码是原码除符号位以外的数全部取反得到的。
在计算机中的计算一律以补码形式进行。正数的反码和补码是它本身,负数的补码是其反码加1;
如
原码 | 反码 | 补码 |
0010 | 0010 | 0010 |
1010 | 1101 | 1110 |
1101 | 1010 | 1011 |
还有一种补码的简记方法:原码的符号位不变,从右边第一个1起(第一个1不变)其它位全部取反,即符号位到右边第一个1的中间范围数字全部取反。
3、补码加减法的运算
补码运算时,溢出显得尤为重要,不正确地处理溢出会导致运算结果的错误。
对一个N位二进制补码,其可以表达的范围是 - 2N-1+1 ~ 2N+1 - 1之间。如果超出这个范围就称为溢出了。
判断溢出:1101 + 1011,大家可以看到我拿两种不同颜色标注了它们最开头的两个数,我们把红色的符号位进位值和蓝色相加的进位值进行比较。如果两者相同(即00或者11),则不溢出,如果两者不同(即01正溢出,10负溢出),则发生溢出,最后的解必定会出错。
1101 -3
+ 1011 -5
= 11000
此时,超出位宽的数被自然舍弃,剩下的值为1000,但是1000转换为原码就是1000(即-0),这与我们的答案就有所不同
由此可见不正确地溢出会发生错误
为了避免这种情况,我们可以在计算前将它们的位宽增加一位,如
11110 -3
+ 11011 -5
= 111000
舍去超出位宽的1,剩下的数为11000,转换为原码则为11000(即-8),与我们想要的答案一致