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

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 原始数据类型转换的更多相关文章

  1. Java 基础类型转换byte数组, byte数组转换基础类型

    Java 基础类型转换byte数组, byte数组转换基础类型 Java类型转换 java类对象转化为byte数组

  2. Java数据类型转换浅析

    Java数据类型转换分为两种:自动类型转换和强制类型转换. 数据类型转换的关键是数据类型相应的表数范围大小 1.自动类型转换: 概念:小范围数据类型会自动转化成大范围数据类型 实例: int a=10 ...

  3. 关于Java String 类型转换时null的问题(转)

    关于Java String 类型转换时null的问题 开发中经常遇到从集合类List.Map中取出数据转换为String的问题,这里如果处理不好,经常会遇到空指针异常java.lang.NullPoi ...

  4. Java的类型转换

    Java的类型转换 在适当的时候,我们会想要将一种数据类型自动转换成另一种,比如把int转化成float类型.Java有隐藏式的自动转换,可以自动转换成想要的类型,但是强制的自动转换的话,.需要将希望 ...

  5. Java byte类型转换成int类型时需要 & 0XFF的原因

    Java byte类型转换成int类型时需要 & 0XFF的原因 假设有byte b  = -1; 那么b的二进制是:1111 1111. 如果将b直接转换为int类型,那么二进制是 1111 ...

  6. Java里面类型转换总结

    1.String 转 int int i = Integer.valueOf(my_str).intValue(); int i = Integer.parseInt(str); 2.String 转 ...

  7. JAVA强制类型转换(转载+自己的感想) - stemon

    JAVA强制类型转换(转载+自己的感想) - stemon 时间 2013-10-29 15:52:00  博客园-Java原文  http://www.cnblogs.com/stemon/p/33 ...

  8. Java数据类型转换1

    1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...

  9. Java List 类型转换

    java的类型转换让人忍不住在开始编码前骂一声  FUCK! 1  子类转父类 up List<SubClass> subs = ...; List<? extends BaseCl ...

随机推荐

  1. [原创]dm642_HPI调通并boot成功

    一直在折腾前段时间画好的dm642+lpc4357板子,说明下这个板子的结构: 主芯片为DM642,这个片子很老了,但因为对这个片子熟悉,别折腾 没有给DM642加FLASH,配了一片LPC4357, ...

  2. applicationContext.xml详解 spring+mybatis+struts

    今天给大家详细解释一项关于Spring的applicationContext.xml文件,这对于初学者来说,应该是很有帮助的, 以下是详解Spring的applicationContext.xml文件 ...

  3. 上网必备AdBlock,远离广告!

    浏览器广告拦截插件,绝对上网必备... 从此告别讨厌的百度边栏广告!!! https://getadblock.com/ https://adblockplus.org/zh_CN/

  4. 【Database】MongoDB教程

    MongoDB是一个基于分布式文件存储的数据库.旨在为WEB应用提供可扩展的高性能数据存储解决方案.

  5. node 与php整合

    http://wenku.baidu.com/view/c1810c18b7360b4c2e3f6479.html http://www.xiaocai.name/post/cf1f9_7b6507 ...

  6. win7+ubuntu双系统安装方法

    转自win7+ubuntu双系统安装方法 前段时间又安装一下win7+ubuntu双系统,过段时间就会忘记,这次自己写下来,以便以后查看. 1.      先准备一个分区来安装ubuntu.在win7 ...

  7. 监控 DNS 流量,预防安全隐患五大招!

    尽管 IT 管理员尽心尽责地监控设备.主机和网络是否存在恶意活动的迹象,却往往出力不讨好.主机入侵检测和端点保护对很多公司来说可能是"必需"的安全措施,但如果要找出 RAT.roo ...

  8. 11个显著提升 ASP.NET 应用程序性能的技巧——第1部分

    [编者按]本文出自站外作者 Brij Bhushan Mishra ,Brij 是微软 MVP-ASP.NET/IIS.C# Corner MVP.CodeProject Insider,前 Code ...

  9. CABAC

    CABAC(Context-based Adaptive Binary Arithmetic Coding),基于上下文的自适应二进制算术编码.CABAC是H.264/AVC标准中两种熵编码中的一种, ...

  10. python functools模块

    functools.partial 作用: functools.partial 通过包装手法,允许我们 "重新定义" 函数签名 用一些默认参数包装一个可调用对象,返回结果是可调用对 ...