byte类型(2)

/*
 面试题:
 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
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值