拓宽并窄化原始类型的转换

拓宽并窄化原始类型的转换即widening and narrowing primitive conversion

byte转char过程就是拓宽并窄化原始类型的转换:byte 被转换成了int,而这个int 又被转换成了char。

 

 

		System.out.println((int)(char)((byte)(int)-1)); //65535
		System.out.println((int)(char)(byte)(-1&0xff)); //65535
		System.out.println((int)(char)(-1&0xff));  //255
		System.out.println((int)(short)(char)((byte)(int)-1));  //-1
		// 位运算
		System.out.println(Integer.toBinaryString(-1)); //11111111111111111111111111111111
		BigInteger src = new BigInteger("ff",16); //字面量本身是没有符号的,例如10进制,2进制,16进制数字
		System.out.println(src.toString()); //255
		//char 转 int
		char x = (char)((byte)(int)-1);
		int m = x;
		System.out.println(m); //65535
		int n = (short)x;
		System.out.println(n); //-1

 

转换过程

1. int类型-1常量转换为byte, 即0xff

2. byte转char,执行两步:

1) 先byte转int, 即0xffffffff;

2) 再转换成char,截断高2个字节,0xffff;

3. 转换成int即,显示65536

 

这里涉及一个比较重要点的转换规则即:窄整形数据到宽整形数据转换规则—》如果最初的数值类型是有符号的,那么就执行符号扩展;如果它是char,那么不管它将要被转换成什么类型,都执行零扩展。

 

byte到char扩展过程:

1. 如果不希望发生符号拓展

byte b = -1;

char c = (char)(b & 0xff); // 即b已经不是当初的有符号类型的byte了,与下面的对比;

 

2. 如果希望发生符号拓展

byte b = -1;

char c = (char) b; //即等价于 char c = (char)(byte)b; 即b还是有符号类型的;

 

 

char转int扩展过程:

1. 如果不希望发生符号拓展:

int i = c & 0xffff 或者 int i = c;  // 由于char本身是无符号的,所以可以不进行位运算;

 

2. 希望发生符号拓展:

int i = (short) c; //先转成有符号的short,再转成int; 

 

 

 

深入:http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值