进制转换
其他进制转换为十进制
为了跟程序中的进制表达一样,下面我用(0b,0,0x分别表示二进制,八进制,十六进制)
十进制 35
二进制 0b10101
八进制 0123
十六进制 0x110
十进制转换为二进制(除2倒取余)
除2即是将十进制的数除2,取余,所得商再除2取余,直到不能整除,最后将余数从下至上写出来
十进制转八进制
转换方法跟十进制转二进制一样,只是转八进制是除8求余
十进制转16进制
思路和前面两种进制转换相同
由此可得各进制的取值:
二进制取值:0 1
八进制取值:0 1 2 3 4 5 6 7
十六进制:0 1 2 3 4 5 6 7 8 9 A B C D E F
上面都是整数的十进制转其它进制,接下来讲述带小数点
整数是除2取余,小数则是乘以对应进制数取整,直到达到要求的精度,顺序排列
十进制转二进制(小数)
具体做法:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数 部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。
以10.8来举例
十进制转八进制
与二进制计算方法相同!
十进制转16进制
二进制转八进制
将二进制数,从右往左,每3个数字分成一份,将每一份的二进制数转换为10进制,然后将十进制数拼起来就是结果
0b1100100 (编程中0b开始表明该数是二进制 )从右往左每三个组成一份
1 100 100 不够再最前面添0
001 100 100 最后用二进制转十进制方法挨个计算
1 4 4 答案即是 0144 (编程语言中常常以数字0开始表明该数字是八进制,文章开头有提及)
二进制转十六进制
将二进制数,从右往左,每4个数字分成一份,将每一份的二进制数转换为十进制,然后将转换之后的10进制数拼起来就是结果
0b11101000 每4个分成一组
1110 1000 按二进制转十进制方法挨个计算
e 8 答案即是0xe8
补充:十六进制中10 11 12 13 14 15分别表示为a b c d e f (字母不区分大小写)
原码/反码/补码
计算机中处理数据最小单位:bit
在实际使用中最少使用8个bit来存放数据,也就是一个byte
计算机为了能存放负数,所以设计为:第一位为符号位
1:表示负数
0:表示整数
例如:10000001 ----->-1
00000001 ------->1
那么10000000与00000000相等嘛,按照数学理论来说,两者都是数值为0
但是计算机为了不用两个byte表示一个数字,所以将10000000设计值为-128
所以一个byte的取值范围:-128~127
计算机在存数字时,其实都是在存该数字对于的补码形式
原码:就是该数字本身的二进制形式
反码:
正数的反码与该数字的原码形式一致
负数的反码,符号位不变,其他为全部取反
1的反码:00000001
-1的反码:11111110
补码:
正数的补码与该数字的原码形式一直
负数的补码:该数字的反码+1;即对原码:符号位不变取反+1
1的补码:00000001
-1的补码:11111111
计算机底层存放补码,可以提高运算的效率,例如求1-1的值,其实就相当于1+(-1)
00000001
+
11111111
············
00000000
记住:计算机中存储的是补码形式,也就是说计算过后,也是补码
例如2-3=-1
2的原码:0000 0010 2的反码:0000 0010 2的补码:0000 0010
-3的原码:1000 0011 -3的反码:1111 1100 -3的补码:1111 1101
二者的补码相加结果:1111 1111 这个结果并不是计算错误,而是结果是补码形式.,又因为数值计算结果为负数,所以得再符号位不变,取反+1所以最后结果应该是:1000 0001 即-1
3-2 = 1
3的原码:0000 0011 3的反码:0000 0011 3的补码:0000 0011
-2的原码:1000 0010 -2的反码:1111 1101 -2的补码:1111 1110
二者补码相加结果:0000 0001。因为计算结果为整数,即符号位为0,原码的补码就是其本身。结果即为:0000 0001。
整数的类型转换
基本数据类型的相互转换:
小转大,自动转
大转小,强制转
自动转自然不会存在安全隐患,但是强制转存在,即如果转换之前的值大小超过了转换之后的类型的取值范围,计算机会将超出的数据直接去掉
例如:
//00000000 00000000 00000000 10000010
int i = 130;
//10000010 反码:10000001 原码:11111110
byte b = (byte)i
System.out.println(b);//-126
上述例子是声明了一个int类型的变量,值为130,因为int类型表示4个byte,即32位,所以i的原码为00000000 00000000 00000000 10000010,将i的值赋值给byte类型的b后,由于byte所能表达的数值范围:-128~127,即八位(包含了符号位)。所以计算机会将前24位去掉。此时b的补码即为:10000010.倒推为原码:11111110。即为-126