10进制
10进制和2进制可以相互转换
23678(10进制)=2*10000+3*1000+6*100+7*10+8*1
=2*10^4+3*10^3+6*10^2+7*10^1+8*10^0
=23678
10称为“基数”、10^n称为“权”
2进制
二进制的基数为2、权为2^n
0100 0001(2进制)=1*2^6+1*2^0=65(十进制)
java中的二进制规则
1.java内部只有二进制补码,计算机内部数据以二进制补码表示
2.java内部采用补码运算,自动发送上溢出(乘法为上溢出)和下溢出(除法为下溢出)
3.java内部没有10进制!但java尽量按照人类习惯输出输入
4.补码的负数最高位是1,也成符号位。
16进制
16进制是2进制的简写。
10进制:1234567890
2进制:0010 0100 1100 1011 0000 0010 1101 0010
16进制:499602d2
16进制的基数为16 , 权为16^n:4096 256 16 1
16进制和其他进制的转换:
41(16进制)=4*(16^1)+(16^0)=65(10进制)=0100 0001(2进制)
package basic.day02;
public class BinDemo{
public static void main(String[] args){
int i=192;
System.out.println(Integer.toBinaryString(i));
System.out.println(Integer.toHexString(i));
i=oxf4;
System.out.println(i);
System.out.println(Integer.toHexString(i));
i=o72;
System.out.println(i);
}
}
补码
8421编码
0 0000 8 1000 -8
1 0001 9 1001 -7
2 0010 10 1010 -6
3 0011 11 1011 -5
4 0100 12 1100 -4
5 0101 13 1101 -3
6 0110 14 1110 -2
7 0111 15 1111 -1
8 1000 0 0000
9 1001 1 0001
10 1010 2 0010
11 1011 3 0011
12 1100 4 0100
13 1101 5 0101
14 1110 6 0110
15 1111 7 0111
分析:
计算机中使用四位二进制的数表示数据,最多能表示0-15(10进制);
将所有1开头的数全部放到0000之前,并且用来表示负数,这就是四位补码;
-1(1111)+1(0001)=0(10000),即溢出最高位“1”,保留4个0,那么得到的-1+1=0;-8(1000)+7(0111)=-1(1111)
-1(1111)*-1(1111)
1111
* 1111
-------------------------
1111
1111
1111
1111
---------------------------
000 0001
得出的结论:
在封闭的四位运算中(超出4位就丢弃),这种运算规则就是补码。
知识点
1.计算机中正数和负数的关系就是取反加一:~3(1100)+1(0001)=-3(1101);
2.补码运算是封闭的:运算结果保留在补码范围之内,超范围就溢出;
3.补码边界运算有溢出风险;
4.4位二进制补码最多能表示2^4(16)个数,数的范围是:-8~7;
5.8位二进制补码最多能表示2^8(256)个数,数的范围是-128~127;
6.16位二进制补码最多能表示2^16(65536)个数,数的范围是-32768~32767
7.32位二进制补码最多能表示2^32个数,数的范围是-2G~2G-1(1G=1024*1024*1024)
二进制转换成10进制
1111 1001
第一步:按位取反 0000 0110
第二步:末尾加1 0000 0111
第三步:将二进制转换成10进制 2^0+2^1+2^2=7
第四步:因为是1打头,因此带上负号:-7
10进制转换成2进制
-7
第一步:先算出7的2进制:0000 0111
第二步:按位取反 1111 1000
第三步:末尾加1 1111 1001
总结如下:
计算机中二进制转换成10进制
1.以0开头的,直接将2进制转换为10进制;
2.以1开头的,需四步,按位取反,末尾加1,转换为10进制,加负号;
10进制转换为2进制
正数取原码,负数按位取反末尾加一
注意:4位补码不能表示8,要是表示8必须使用8位以上类型补码。