/*
面试题:
byte b = 130;有没有问题?
如果有问题,请问怎么解决?
解决后的结果是什么?
为什么结果是这个样式的?
*/
public class Demo01 {
/**
* @param args
*/
public static void main(String[] args) {
// byte -- -128~127
// 解决方案:把数据类型提升。
// 我们可以通过把数据赋值给short,int,long来解决问题。
// 但是,我们不想这样做,就只想把数据赋值给byte类型。
// 数据类型转换
// 从大到小:所占用的字节数比数据类型所能表示的大。
// 从小到大:所占用的字节数比数据类型所能表示的小。
// 一个整数,默认是int类型。
// 也就是说这个130和300其实是int类型的
// 那么,现在你是把int类型赋值给byte类型,
// 也就是从大到小的赋值。这个时候,可能会有溢出。
// 因为你是4个字节的数据,而我只有1个。
// 如果不想使用提升数据类型的方式,那么, 我们就只能使用强制转换了
// 强制类型转换的应用场景:
// 在把一个大的数据类型的值赋值给小的数据类型的时候,需要使用强制类型转换。
// 使用格式是:
// 数据类型 变量 = (数据类型)值;
byte b1 = (byte) 130;// 可能有数据溢出
byte b2 = (byte) 300;// 可能有数据溢出
System.out.println(b1);// -126
System.out.println(b2);// 44
}
}
/*
问题:为什么byte b1 = (byte)130;结果是-126呢?
思考:
A:130这个数据默认是int类型的。
B:在参与运算的时候,得变成补码表示。
C:找到130的补码。通过观察数据,我们知道130是一个正数。
D:正数的原码,反码,补码都相同。所以我们只要写出了130的原码就知道补码。
E:写出130的原码。他的原码其实就是他的二进制表示。
十进制的130 -- 二进制数据来
十进制到二进制:用十进制的数据除以2,直到商为0,余数反转。
F:8421码?
8个bit位的数据
1 1 1 1 1 1 1 1
128 64 32 16 8 4 2 1
1 0 0 0 0 0 1 0
也就是130的二进制:
00000000 00000000 00000000 10000010
G:接下来我们把130给强制转换为了byte类型,那么,这个时候,就出问题了。
byte类型占用1个字节。而我们的130现在占用的是4个字节。
所以,在强制转换的过程中,会有字节数据的丢失。
但是,我们不用搭理它。
直接按照我们的结果来看:
00000000 00000000 00000000 10000010
强制转换为byte类型后,我们的结果就是
10000010
H:这个时候,我们看到了10000010。这个数据应该是补码形式存在的。
我们最终通过显示器看到的应该是原码。
而最高位的1也透露了这个数其实是一个负数。
根据原码,反码,补码的规则,推出这个负数的原码表示。
补码:1 0000010
反码:1 0000001
原码:1 1111110
I:最终我们的数据值是:1 1111110
而我们通过控制台看到的是十进制数据,所以,我们还要把改二进制转换为十进制。
1 1111110
最高位是符号位。所以,该数的结果是一个负数。
128 64 32 16 8 4 2 1
符号位 1 1 1 1 1 1 0
- 64+32+16+8+4+2
-126
问题:
为什么byte b2 = (byte)300 结果是44呢?
第一步:把300的二进制写出来。
1 1 1 1 1 1 1 1 1
256 128 64 32 16 8 4 2 1
1 0 0 1 0 1 1 0 0
300的二进制:
00000000 00000000 00000001 00101100
第二步:所有数据的存储和操作都是补码形式。
截取数据300。
得到:00101100
得到的是一个补码,而我们发现最高位是0,说明是一个正数。所以,这个补码其实也就是原码。
所以,我们直接获取该值即可。
128 64 32 16 8 4 2 1
符号位 0 1 0 1 1 0 0
+ 32+8+4
+44
byte
-128 - 127
byte b = 127;
byte b = (byte)128;//-128
byte b = (byte)129;//-127
byte b = (byte)130;//-126
*/