java劫富济贫之进制换算与数据类型

在计算机的世界是只有0和1的数据存在的,它们只会识别二进制的数,所有的数都是换算成二进制的形式来使用的。人类是使用十进制的,并不方便使用二进制所以,就有了进制换算的问题出现。分别有二进制、八进制、十进制、十六进制。

我们先将把化为二进制的形式

十进制转二进制

我们通常用短除法来解决这类问题,因为二进制是逢二进一的所以用十进制的数短除二求每一步的余数,方法就是除2取余,逆序排列。至于为什么是余数呢?因为除得的余数就是二进制每位的1或0,就代表了每一位的数字。

具体做法是:

  1. 用2整除十进制整数,可以得到一个商和余数;
  2. 再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止;
  3. 然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
有点不美观^^原谅我

 

至于八进制转二进制就和十进制转二进制是一样的了,简单的八或十进制转换见下对照表

至于十六进制转二进制见下表,相信以你的只会是小kiss了

接下来我们看二进制如何转十进制

二进制转十进制

就是从右到左的顺序,依次用2*1或0^0,次方从0开始从左到右依次加1。

从上图可以看出有很多0所以可以进一步简化,0位都可以不加入计算。

直接上图

凉菜没有直接上

二进制转八进制

因为2^3=8所以分成三位一部分计算,不够八位在前面补0补够八位再分。

二进制转十六进制也是同样的道理

二进制转十六进制

因为2^4=16所以分成四位一部分计算,不够八位在前面补0补够八位在分。

 

接下来讲一下数据类型整数型和浮点数型中的的问题,初学数据类型很容易忽略数据之间的转换问题,大家一定要注意。这里先讲基本数据类型的相关问题,重点是整型之间的转换问题,很容易出错,大家注意。

基本数据类型

整型

浮点型

字符型

布尔型

整型

byte

byte的范围是1个字节,一个字节为8位,比如说11111111,按正常思路byte的范围是0-256之间,但因为存在负数的问题,所以会按一半一半划分范围,负数范围为-128~127之间,正数应该为1~128之间,但是这里要注意缺少0,所以正数的正确范围为0~127之间。所以byte的范围为-128~127。

这个数字是怎么计算出来的呢?

因为byte型有一个字节,一个字节为八位,所以范围为-2^7~2^7-1。

short

short的范围为2字节,为-2^15~2^15-1

int

int的范围为4字节,为-2^31~2^31-1

long

long的范围为8字节,为-2^63~2^63-1

接下来我们看一个例子

public class Test01{
    public static void main(String[] args){
        byte a1=100;
        byte a2=1;
        byte a3=a1+a2;
        System.ot.println(a3);
    }
}

注意:这里编译器是无法输出的,会报错。这是因为常量100和1都是默认的int型,而a1,a2,a3都是byte型,这样的话就会出现数据类型不兼容的问题,从而无法输出,那么这里要怎么办呢?很简单数据类型相同就可以了,看下面

public class Test04{
    public static void main(String[] args){
        byte a1=100;
        byte a2=1;
        byte a3=(byte)a1+a2;
        System.out.println(a3);
    }
}

这里要注意byte a3=(byte)a1+a2;前面加(byte)是强制转换的意思,那么这样可以正常运行吗?也不可以,原因是只转换了a1,a2还是默认int型,所以正确的应该是byte a3=(byte) (a1+a2);

public class Test04{
    public static void main(String[] args){
        byte a1=100;
        byte a2=100;
        byte a3=(byte)(a1+a2);
        System.out.println(a3);
    }
}

byte a3=(byte) (a1+a2);就是强制把a1a2转换成byte型来赋值运算的。那么再看

public class Test04{
    public static void main(String[] args){
        byte a1=100;
        byte a2=100;
        byte a3=(byte)(a1+a2);
        System.out.println(a3);
    }
}

我们把a2的值改为100那么可以正常运行吗?

可以,我们看结果

-56

答案是-56,咦,大家会问了怎么会是-56呢?不应该是200吗?这里就是byte类型的范围问题了。byte的范围为-128~127之间,200超过范围了,但是还是输出了,这就是强制转换的结果了。

200=11001000

减一11000111

取反00111000

那么我们继续看short型会怎样

public class Test04{
    public static void main(String[] args){
        short a1=100;
        short a2=1;
        short a3=a1+a2;
        System.out.println(a3);
    }
}

这里也是不能输出的原因和byte型相同

public class Test04{
    public static void main(String[] args){
        short a1=100;
        short a2=1;
        short a3=(short)(a1+a2);
        System.out.println(a3);
    }
}

同上,这样就可以了

我们看int型会怎么样

public class Test04{
    public static void main(String[] args){
        int a1=100;
        int a2=1;
        int a3=a1+a2;
        System.out.println(a3);
    }
}

这样是可以直接输出的,这是为什么呢?这是因为100,1,a1,a2,a3都是int型,数据类型相同所以没有不兼容类型的出现。

那么我们继续看long型会如何呢?

public class Test04{
    public static void main(String[] args){
        long a1=100;
        long a2=1;
        long a3=a1+a2;
        System.out.println(a3);
    }
}

是可以直接输出的,大家会问了这是为啥哩,它们的数据类型不相同啊。这里的原因是long的范围大于int向上兼容了。

浮点型

float型4个字节

double8个字节

计算机默认double型数据类型,所以float和double的转换和上面原理相同这里就不赘述了

我们直接看

public class Test04{
    public static void main(String[] args){
    	float a1=1.12;
    	
        System.out.println(a1);
    }
}

这样可以输出吗?不可以,这里会出现语法错误的问题,1.12默认double型,a1为float型不兼容与上相同,那么要如何做呢

public class Test04{
    public static void main(String[] args){
    	float a1=1.12F;
    	
        System.out.println(a1);
    }
}

float a1=1.12F,在常量的后面加上F或f就可以了。

 

初出江湖之行侠仗义篇小结。

离华山论剑又进一步!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值