无符号数:
对于无符号数,二进制表示容易理解,它的表示范围:
比如一个 4位的无符号数字,它表示的范围从0——2^4-1,即 从0——15,共16个数字;
二进制表示 | 十进制表示 |
0000 | 0 |
0001 | 1 |
… | … |
1111 | 15 |
当无符号数进行右移时,都是进行逻辑右移,即左边空位为0补齐,比如1101右移两位变为0011;
有符号数
对于有符号数,用补码表示,其实是把负数用补码表示。。什么是补码呢??比如说吧,对于一个钟表来说,它能表示的范围为12,我们反向转2个格时,也可以用正向转10个格表示。所以啊,-2 对应的补码就是10; 对于4位的表示的二进数,它能表示为从-8到7共16个数字,如下所示:
二进制 | 十进制 | 二进制 | 十进制 |
0000 | 0 | 1000 | -8 |
0001 | 1 | 1001 | -7 |
0010 | 2 | 1010 | -6 |
0011 | 3 | 1011 | -5 |
0100 | 4 | 1100 | -4 |
0101 | 5 | 1101 | -3 |
0110 | 6 | 1110 | -2 |
0111 | 7 | 1111 | -1 |
对有符号数进行右移时,基本都是进行算术右移,即补符号位。 对于正数来说,它的符号符号位为0,所以算术右移时,左边空出位补 0; 对于 负数来说,它的符号位为1,所以算术右移时,左边空出位补1。
用算术右移代替除数
对于正整数来说,在计算机中的当除不尽时,会直接抛弃小数位,只保留整数位。所以呢,对于正数来说,整数除法的结果总是小于或等于实际结果。 对于负数来说,整数除法的结果总是大于或等于实际结果。比如: 3 /2 = 1 , -3 /2 = -1;
当我们作算术右移来代替除法时,对于正整数来说,结果没有问题,比如:
对于负整数来说,结果会经常比应该得到的结果大1。比如:
解决办法为: