数据类型转换分为自动类型和强制类型转换
自动类型转换:通过自动可以看出,不需要人为的强加的干预,自动的进行的一种行为方式。
强制类型转换:通过强制可以看出,是需要人为进行干预的。
什么时候会出现上面描述的这种情况???
从内存当中看,当存储空间小的数据存储在存储空间大的时,可以放得进去;
当存储空间大的数据存储在存储空间小的,那么这种情况就得分为两种情况来进行研究。1、大容量小数据放进小容量中,小数据是没有问题的;2、大容量大数据放进小容量中显然是不可以的。
举例子来说明:
byte b = 125;
byte a = 12;
a = b;
// 这种情况是否可以?
// 看上去,这是相同的数据类型,只要是在这个数据类型的,显然都可以放进去
// 所以,相同的数据类型进行相互赋值的时候,不在考虑范围之内
我们需要研究的是同一种类型的进行相互转换。
这里的同一种类型指的有:整数的四大中,继承和接口实现这三大类
这里暂时只研究整数的情况。后续将研究面向对象当中的内容
整数类型四大类:byte,short,int ,long
byte:一个字节
short:两个字节
int:四个字节
long:八个字节
当byte转换到int的时候,显然是可以的。
当int类型转换到byte类型时候,这里可能会存在问题。着重研究这个
byte a = 12;
int b = 255;
a = b;
// 这里会发生什么情况???探究一个这个内容
// 补充一下,在计算机进行运算的时候,会采用补码的形式来进行运算,因为安全可靠
对于正整数来说,补码原码补码都是一样的;
对于负整数来说,遵循下面的原则
原码:数据转换成最原始的01数据
反码:除了原码的符号位,其余各位全部取反
补码:在反码的最右边的位置上+1
如:120
原码 | 反码 | 补码 |
---|---|---|
01111000 | 01111000 | 01111000 |
如-120
原码 | 反码 | 补码 |
---|---|---|
11111000 | 10000111 | 10001000 |
// 继续上面的探究内容
byte a = 12中12对应的补码是:00001100
int b = 255中255对应的补码是:00000000 00000000 00000000 11111111
当把b赋值给a时,会将b最右边的111111111放在a的内存空间当中去。但是这里就有了一个问题了。b将最后一个11111111字节放在里面的时候,11111111这个认为是原码还是补码呢??这里进行了测试,这里是将11111111当成了原码来进行处理。
原码:11111111
反码:10000000
补码:10000001
这里最终会是-1
在java中的移位原理同样也是如此。移位后的也会当成原码,然后转换,最后得到数据。例子:
int i = -153,左移两位
原码 | 反码 | 补码 | 左移后 |
---|---|---|---|
10000000 00000000 00000000 10011001 | 11111111 11111111 11111111 01100110 | 11111111 11111111 11111111 01100111 | 11111111 11111111 11111101 10011100 |
这里的左移之后的二进制数据将会被当成是原码,最终解析成补码在计算机中存储。
原码 | 反码 | 补码 |
---|---|---|
11111000 | 10000000 00000000 00000010 01100011 | 10000000 00000000 00000010 01100100 |
最终的数据是-612,这就是左移几位,乘以2的几次幂。
java中默认如果书写了一个整数,默认是int类型的。如果需要制定类型,需要手动添加。