今天,做个关于二进制的算法题,突然有个问题一直想不通为什么~5是6,计算机基础知识不过关啊,所以现在来弥补下,正数和负数在计算机中是怎么存储和计算的。
讲讲计算机中的存储形式:
计算机中存储的数都是以补码的方式存储的,而正数的原码,反码,补码都是一样的。但是负数的原码,反码,补码是不一样的。
下面都是以java中的int i=5为例。
正数5的原码就是其二进制码:00000000 00000000 00000000 00000101
反码是:00000000 00000000 00000000 00000101
补码是:00000000 00000000 00000000 00000101
-5的原码是:10000000 00000000 00000000 00000101;
反码是:11111111 11111111 11111111 11111010;//除符号位所有位取反
补码是: 11111111 11111111 11111111 11111011;//反码加1
那么java中~5是怎么计算的?
~5的补码:
原码:00000000 00000000 00000000 00000101
取反得补码:11111111 11111111 11111111 11111010
求~5的原码:由上面的补码的反码:11111111 11111111 11111111 11111001
取反得原码:10000000 00000000 00000000 00000110;//也就是-6
计算机中的计算都是以补码的形式进行计算的:
-5的补码是: 11111111 11111111 11111111 11111011
1的补码是:00000000 00000000 00000000 00000001
那么-5+1就是:
11111111 11111111 11111111 11111011 |
+ 00000000 00000000 00000000 00000001 |
11111111 11111111 11111111 11111100 |
11111111 11111111 11111111 11111100是计算机中的补码,减1转换为反码是:11111111 11111111 11111111 11111011,取反得原码是:10000000 00000000 00000000 00000100;
补充一点:
二进制的减法:
0-0=1-1=0
1-0=1
0-1=1(向高位借位)
1 1 0 0 0 0 1 1
- 0 0 1 0 1 1 0 1
-------------------
1 0 0 1 0 1 1 0