在计算机的世界是只有0和1的数据存在的,它们只会识别二进制的数,所有的数都是换算成二进制的形式来使用的。人类是使用十进制的,并不方便使用二进制所以,就有了进制换算的问题出现。分别有二进制、八进制、十进制、十六进制。
我们先将把化为二进制的形式
十进制转二进制
我们通常用短除法来解决这类问题,因为二进制是逢二进一的所以用十进制的数短除二求每一步的余数,方法就是除2取余,逆序排列。至于为什么是余数呢?因为除得的余数就是二进制每位的1或0,就代表了每一位的数字。
具体做法是:
- 用2整除十进制整数,可以得到一个商和余数;
- 再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止;
- 然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
![](https://img-blog.csdnimg.cn/20200207203822793.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTIxNTk3NQ==,size_16,color_FFFFFF,t_70)
至于八进制转二进制就和十进制转二进制是一样的了,简单的八或十进制转换见下对照表
至于十六进制转二进制见下表,相信以你的只会是小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就可以了。
初出江湖之行侠仗义篇小结。
离华山论剑又进一步!