package conversationofnumbersystems;
public class Test1 {
public static void main(String[] args){
/**
* 计算机刚开始都是二进制,0101的形式,但是由于二进制表示大数据太长了,所以就产生了8进制和16进制用来存储大数据。
* 8进制是将二进制的3个位作为一段,使用其十进制的值表示
* 16进制是将二进制的4个位作为一段,使用十进制的值表示,不过10~15使用ABCDEF表示,a~f支持大小写
* 数制是用一组固定的符号和统一的规则来表示数值的方法
* 计算机底层使用的数制是二进制
* java编写程序使用的是十进制,但是java底层使用的仍然是二进制
* 常用的进制还包括8进制和16进制
*
* 十进制的基本数字是0~9,逢10进位
* 10被称为基数,10的n次幂被称为权
* 10000=1*10^4(注意:这里我的^是表示指数的,在数学里是这样表示的,但是在计算机语言中^表示的不是指数,是一种位运算符,将两个数转换成2进制,不同则为1)
* 1000=1*10^3
* 23678=2*10^4+3*10^3+6*10^2+7*10^1+8*10^0
*
* 二进制的基本数字是0 1,逢2进位
* 二进制的基数为2,权为2的n次方
* 在Java中使用0b作为前缀
* 1=1*2^0
* 10=1*2^1+0*2^0
* 100=1*2^2+0*2^1+0*2^0
* 1111(二进制)=1*2^3+1*2^2+1*2^1+1*2^0=15 或者1111+1=10000-1=2^5-1=15
*
* 十六进制
* 基本数字: 0 1 2 3 4 5 6 7 8 9 A B C D E F (字母可以是大写表示也可以小写表示)
* 基数为16,权为16的n次方
* 十六进制实际上是二进制的简写,方便专业人员书写二进制数据,因为二进制表示大数据过长
* 在java中十六进制用0X或者0x作为前缀
* 1=1*16^0
* 10=1*16^1+0*16^0
* 5e=5*16^1+14*16^0=5*16+14*10=94
*
* 十六进制转化为十进制
* 0x12 =1*16^1+2*16^0=18
* 十六进制转换为二进制
* 0x12=00010010
* 方式:因为16是2的4次方,所以可以将16进制的每一位转换成为4位的二进制然后联合起来,十六进制和二进制每一位的连接使用的是加法而不是乘法
*
* 照这个逻辑,8进制是2的3次方,所以八进制转换成为2进制就是将每一位8进制的数转换成3位的2进制数,联合起来。
* 012=001010
* 十六进制和8进制的转换可以通过2进制作为媒介达到效果。
* 二进制转换成为16进制和2进制转换成为8进制也是类似的原理
*
* 将10进制转换成为2进制、8进制、16进制
* 转为2进制,10一直除2,知道商为0,将余数倒叙联合就是了
* 除数 被除数 商 余数
* 2 10 5 0
* 2 5 2 1
* 2 2 1 0
* 2 1 0 1
* 得到:1010=2^3+2^1=10
* 8 56 7 0
* 8 7 0 7
* 得到070=7*8^1+0*8^0=56
* 16 466 29 2
* 16 29 1 13
* 16 1 0 1
* 得到0x1D2
*
*/
int x=0x1D2;
System.out.println(x);
/*System.out.println(Integer.toBinaryString(18));
System.out.println(Integer.toOctalString(18));*/
}
}
8421码将2进制转换成为10进制:
8421码的原理是将一些常用的二进制的位值代表的十进制列出来,查找替换进行十进制和二进制的转换。
1 1 1 1 1 1 1 1
128 64 32 16 8 4 2 0
二进制转10进制:
0b10010=2+16=18
十进制转2进制:
18=16+2=0b10010
178=128+32+16+2=0b10110010
浮点型的进制转换:
浮点型的存储结构和整形的不一样
浮点型的存储范围大于long型。
不是太明白,不想深究了。
float类型数字在计算机中用4个字节存储。遵循IEEE-754格式标准:
一个浮点数有2部分组成:底数m和指数e
底数部分 使用二进制数来表示此浮点数的实际值
指数部分 占用8bit的二进制数,可表示数值范围为0-255
但是指数可正可负,所以,IEEE规定,此处算出的次方必须减去127才是真正的指数。
所以,float类型的指数可从-126到128
底数部分实际是占用24bit的一个值,但是最高位始终为1,所以,最高位省去不存储,在存储中占23bit
科学计数法。
格式:
SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
S表示浮点数正负
E指数加上127后的值得二进制数据
M底数
举例:
17.625在内存中的存储
首先要把17.625换算成二进制:10001.101
整数部分,除以2,直到商为0,余数反转。
整数部分:17=10001
小数部分,乘以2,直到乘位0,进位顺序取。
小数部分:
0.625*2=1 .25
0.25*2=0 .5
0.5*2=1 .0
0*2=0 .0
......
得到:1010...
在将10001.101右移,直到小数点前只剩1位:
1.0001101 * 2^4 因为右移动了四位
这个时候,我们的底数和指数就出来了
底数:因为小数点前必为1,所以IEEE规定只记录小数点后的就好。所以,此处的底数为:0001101
指数:实际为4,必须加上127(转出的时候,减去127),所以为131。也就是10000011
符号部分是整数,所以是0
综上所述,17.625在内存中的存储格式是:
01000001 10001101 00000000 00000000
换算回去:自己做。