您的位置 首页 java

零基础学编程之进制转换基础

十进制

十进制(逢10进1)是我们最常用的一种数位迚制方式。十进制和二进制可以相互转换,举例如下:

 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(10的n次幂)被称作 ,… 10000、1000、100、10、1。

二进制

二进制(逢2进1),是基数为”2″的进制。计算机使用二进制,是因为计算机设计者发现在复杂电路中,将低电平表示0,高电平表示1,只有两种电位在通过门电路之后更容易计算。其实用其它进制也可以表示,但是比较麻烦。

二进制的基数为2,权为2^n(2的n次方),…、128、64、32、16、8、4、2 1。

 0100 0001(2进制)  =  1*64 + 1*1  =  65(10进制)  

补码基础

关于补码,有如下比较有趣的演化过程:

假如计算机中使用4位的二进制表示数据,如图3-1中的a,最多能表示0到15(10进制),后有计算机大佬在此基础上做了一个细微改动,将所有二进制以1开头的数(大于7的数)放到0之前:如图3-1的b,并且规用用这部分8-15对应二进制表示负数-1到-8,这就是4位补码:如图3-1的c。

图3-1

仔细观察会发现,-1(1111)+1(0001) = 1 0000,舍弃最高位”1″(超出4位),保留最后4位(4个0),则-1(1111)+1(0001) = 0(1 0000)

      - 11111
 +    1 0001
----------------------
       10000  

同理-8(1000)+7(0111)=-1(1111)。

至此,得出了结论:在封闭的四位运算中(超出4位就丢弃),这种设计和规定是非常合理的。可是,我们又有了疑问:(-1)*(1)=?,会不会和结果就不一样了?我来算一下:

    -1  1111
*    -1  1111
---------------------------
       1111
     1111
   1111
   1111   
-----------------------
         0001  

结果一样,(-1)*(-1)= 1即1111 * 1111 = 0001,这种数据运算规则就是补码运算。

总结:

  • 计算机中正数和负数的关系是取反加一。举例如:~3+1=-3(~3表示对3取反)
  • 补码运算是封闭的:运算结果保留在补码范围内,超范围就溢出.
  • 补码边界运算有溢出风险.
  • 4位二进制补码最多能表示2^4(16)个数,数的范围是-8~7
  • 8位二进制补码最多能表示2^8(256)个数,数的范围是-128~127
  • 16位二进制补码最多能表示2^16(65536)个数,数的范围是-32768~32767
  • 32位二进制补码最多能表示2^32个数,数的范围是-2G~2G-1(1G= 1024*1024*1024)

当我们知道了计算机中的一个二进制数,比如0000 1111,它的10进制为:

 0000 1111 = 2^3+2^2+2^1+2^0 = 15(十进制)   // 因为是正数,直接转换既可  

那1111 1001,表示的十进制数是多少?

               1111 1001                      
取反码    0000 0110                     //第1步:按位取反
加1                        1                    //第2步:末尾加1
----------------------------
              0000 01111        (7)  //第3步:将二进制转换为十进制
                                         (-7)//因为是以1开头,带上负号  

则计算机中存储的1111 1001转换为十进制数是-7。反过来的换算过程如下:

 7             0000 0111                      //第1步:先算出7的二进制
取反码    1111 1000                      //第2步:按位取反
加1                        1                     //末尾加1
----------------------------
              1111 1001        (-7)    

计算机中二进制(转)十进制:

  • 以0开头的,直接将2进制转换为10进制;
  • 以1开头的,需要4步,按位取反->末尾位加1->转换为十进制->添加负号。

十进制数(转)计算机中二进制数:

  • 正数取原码,负数按位取反末尾加1。

需要注意的是:4位补码不能表示8。

java中的二进制规则

  • Java内部只有二进制补码,计算机内部数据以二进制补码表示。
  • Java内部采用补码运算,自动发送上溢出(乘法为上溢出)和下溢出(除法为下溢出)。
  • Java内部没有10进制,但是Java尽量按照人类习惯输入输出。
  • 补码的负数,最高位是1,也称作符号位。

十六进制

十六进制是二进制制的简写,方便专业人员书写二进制数据。比如一个十进制数1234567890,用十六进制表示就比二进制表示更方便,如下所示:

 十进制:    1234567890
二进制:    1001001100101100000001011010010
十六进制: 499602d2  

十六进制的基数为16,权为16^n(16的n次方),…、4096、256、16、1。

十六进制与十进制对照表:

 0 1 2 3 4 5 6 7 8 a    b   c   d   e   f       (16进制) 
0 1 2 3 4 5 6 7 8 10 11 12 13 14 15   (10进制)  

十六进制和其他进制间的转换:

41(16进制) = 4*(16^1) + 1*(16^0) = 65(10进制) = 0100 0001(2进制)

10进制、2进制、8进制、16进制对照表

文章来源:智云一二三科技

文章标题:零基础学编程之进制转换基础

文章地址:https://www.zhihuclub.com/184309.shtml

关于作者: 智云科技

热门文章

网站地图