Java 原始数据类型转换

在开发中经常遇到数据类型转换的问题,大多数都是拿来强制转换,强制转换可能会出现你意想不到的问题:

int a = -1;

我们经过多重转换之后:int b = (int)(char)(byte) a ;

System.out.println(b);

预计结果还会是-1吗?

打印结果:65535

我们来分析下原因:

Java使用基于2的补码的二进制运算,因此int类型的数值-1的所有32都是置位的;

1、int——>byte  转型很简单,它执行了一个窄化原始类型转化,直接将除8位之外的所有位干掉,留下的是一个8位都被置位了的byte,它仍旧表示-1;

2、byte——>char 因为byte是一个有符号类型,而char是个无符号类型,将一个整数类型转换为另一个宽度更宽的整数类型时,通常是保持其数值,但是却不能将一个负的byte数值表示成一个char,因此,从byte到char转换被认为不是一个拓展原始类型的转换,而是一个拓展并窄化原始类型的转换:所有byte先转换成int,int又被转换成char。

这听起来感觉有点绕,简单的说:从较窄的整形转换成较宽的整型时的符号扩展行为:如果最初的数值类型是有符号的。那么执行符号扩展;如果他是char,那么不管它将要被转换成什么类型,都被执行零扩展。

所以byte数值-1转换成char时,会发生符号扩展,作为结果的char数值的16个位都被置位了。因此它等于216-1,即65535,从char到int的转型也是一个拓展原始类型转换,,它将执行零扩展而不是符号扩展,作为结果的int数值也就是是65535.

(char是仅有的无符号整形)

如果你将一个char数值 c 转换成一个宽度更宽的类型,并且你不希望有符号扩展,那么可虑使用一个位掩码“

int i = c & 0xffff;

或者用语句直接标明:

int i = c;//不会执行符号扩展


如果你将一个char数值 c 转换转换为一个宽度更宽的整型,并且你希望有符号扩展,那么就先将char转型为一个short,它与char具有同样的宽度,但是它是有符号的:

int i = (short)c;//转型将引起符号扩展


如果你将一个byte数值 b 转型为一个char。并且你不希望有符号扩展,那么你必须使用一个位掩码来限制它,通用做法:

char c = (char)(b & 0xff);


如果你将一个byte数值 b 转型为一个int,将一个整数类型转换为另一个宽度更宽的整数类型:

int i = (int)b & 0xFF

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 自动类型转换(隐式类型转换): 当 Java 虚拟机自动将一种数据类型转换为另一种数据类型时,就发生了自动类型转换。这种换是在编译时期自动完成的,无需程序员进行干预。 自动类型转换的规则如下: 1. 一种数据类型可以自动换为另一种数据类型,只要目标类型的范围大于源类型的范围。 2. 整型可以自动换为浮点型,但浮点型不能自动换为整型。 3. char 类型可以自动换为 int 类型,但 int 类型不能自动换为 char 类型。 示例: ```java int a = 10; double b = a; // 自动类型转换,将 int 类型转换为 double 类型 System.out.println(b); // 输出 10.0 char c = 'a'; int d = c; // 自动类型转换,将 char 类型转换int 类型 System.out.println(d); // 输出 97 ``` 2. 强制类型转换(显式类型转换): 当 Java 虚拟机无法自动将一种数据类型转换为另一种数据类型时,就需要进行强制类型转换。强制类型转换需要程序员手动指定要换的数据类型。 强制类型转换的语法格式如下: ```java 目标类型 变量名 = (目标类型) 原始类型; ``` 示例: ```java double a = 10.5; int b = (int) a; // 强制类型转换,将 double 类型转换int 类型 System.out.println(b); // 输出 10 ``` 需要注意的是,在进行强制类型转换时,可能会发生数据精度丢失的情况。例如,将一个 double 类型的值换为 int 类型时,小数部分会被截断,只保留整数部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值