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
Java 原始数据类型转换的更多相关文章
- Java 基础类型转换byte数组, byte数组转换基础类型
Java 基础类型转换byte数组, byte数组转换基础类型 Java类型转换 java类对象转化为byte数组
- Java数据类型转换浅析
Java数据类型转换分为两种:自动类型转换和强制类型转换. 数据类型转换的关键是数据类型相应的表数范围大小 1.自动类型转换: 概念:小范围数据类型会自动转化成大范围数据类型 实例: int a=10 ...
- 关于Java String 类型转换时null的问题(转)
关于Java String 类型转换时null的问题 开发中经常遇到从集合类List.Map中取出数据转换为String的问题,这里如果处理不好,经常会遇到空指针异常java.lang.NullPoi ...
- Java的类型转换
Java的类型转换 在适当的时候,我们会想要将一种数据类型自动转换成另一种,比如把int转化成float类型.Java有隐藏式的自动转换,可以自动转换成想要的类型,但是强制的自动转换的话,.需要将希望 ...
- Java byte类型转换成int类型时需要 & 0XFF的原因
Java byte类型转换成int类型时需要 & 0XFF的原因 假设有byte b = -1; 那么b的二进制是:1111 1111. 如果将b直接转换为int类型,那么二进制是 1111 ...
- Java里面类型转换总结
1.String 转 int int i = Integer.valueOf(my_str).intValue(); int i = Integer.parseInt(str); 2.String 转 ...
- JAVA强制类型转换(转载+自己的感想) - stemon
JAVA强制类型转换(转载+自己的感想) - stemon 时间 2013-10-29 15:52:00 博客园-Java原文 http://www.cnblogs.com/stemon/p/33 ...
- Java数据类型转换1
1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...
- Java List 类型转换
java的类型转换让人忍不住在开始编码前骂一声 FUCK! 1 子类转父类 up List<SubClass> subs = ...; List<? extends BaseCl ...
随机推荐
- BZOJ 3563 DZY Loves Chinese
Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上 ...
- UIWebView 自定义网页中的alert和confirm提示框风格
.h #import <UIKit/UIKit.h> @interface UIWebView (JavaScriptAlert) -(void)webView:(UIWebView *) ...
- Hibernate 注解多对一 要求在多那边产生一个外键而不会另外产生一个表
在使用hibernate注解的时候,我们映射一对多时,有时候莫名其妙的产生了两张表,其中一张表是A_B,这并不符合数据库中多的一方放置一个外键的原则,那么如何控制只产生一个表呢,请看下面的例子: 多的 ...
- QImage与QPixmap加载图片效果(QImage不能拉伸图片,QPixmap默认拉伸图片)
QImage与QPixmap加载图片 效果 . 分类: QT开发 qtQtQT PixmapTest::PixmapTest(QWidget *parent) : QDialog(parent) {t ...
- poj 2431 Expedition 贪心
简单的说说思路,如果一开始能够去到目的地那么当然不需要加油,否则肯定选择能够够着的油量最大的加油站加油,,不断重复这个贪心的策略即可. #include <iostream> #inclu ...
- error: /lib64/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference
]$ sudo yum install libnotify*Loaded plugins: fastestmirror, refresh-packagekit, securitySetting up ...
- 深入浅出Node.js (附录A) - 安装Node
A.1 Windows系统下的Node安装 A.2 Mac系统下Node的安装 A.3 Linux系统下Node的安装 A.4 总结 A.5 参考资源
- 余弦距离、欧氏距离和杰卡德相似性度量的对比分析 by ChaoSimple
1.余弦距离 余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量. 向量,是多维空间中有方向的线段,如果两个向量的方向一致,即夹角接近零,那么这两个向 ...
- HDU-4920 Matrix multiplication
矩阵相乘,采用一行的去访问,比采用一列访问时间更短,根据数组是一行去储存的.神奇小代码. Matrix multiplication Time Limit: 4000/2000 MS (Java/Ot ...
- Dev控件用法 aspxTreeList 无刷新 aspxGridView 数据
主要是利用 ASPxTreeList 点击事件回发服务器进行数据重新绑定 ASPxTreeList: <SettingsBehavior ExpandCollapseAction="N ...