Java 原始数据类型转换
2013-08-16 17:39
363 查看
在开发中经常遇到数据类型转换的问题,大多数都是拿来强制转换,强制转换可能会出现你意想不到的问题:
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
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
相关文章推荐
- Java 原始数据类型转换
- Java 原始数据类型转换
- Java新手之路——Day 04 数据类型转换
- Java数据类型转换规则
- CoreJava——java中的基本数据类型和类型转换
- C移植到Java中,byte[]与其他数据类型的转换
- Java数据类型转换
- Java下枚举变量与其他数据类型的转换
- java基本数据类型之间的转换问题
- java数据类型之间的转换和什么地方要进行强制类型的转化
- java中数据类型转换 Integer String Long Float Double Date
- 黑马程序员————Java数据类型的转换
- java 数据类型转换的陷阱
- java数据类型转换简述
- java数据类型转换
- 怎样在Java中实现基本数据类型与字符之间的转换
- Java数据类型及类型转换
- java数据类型的相互转换
- [Java练习]数据类型互相转换
- 2 Java基础语法(关键字,标识符,注释,常量,进制转换,变量,数据类型,数据类型转换)