java多重转型问题
我们来看一个简单的问题,下面的代码会打印出什么?
public class hello {
public static void main(String[] args){
System.out.println((int)(char)(byte)-1);
}
}
相信很多人会说最终输出为-1,但是实际结果却是65535,这是为什么?
这个程序中涉及了三次类型转换,该行为紧密依赖于转型的符号拓展行为。Java使用了基于2的补码的二进制运算,因此int类型的-1用32位补码表示就是11111...1111。从int到byte的转型的很简单的,它执行了一个窄化基本类型转换,直接将8位以上的部分砍掉,留下的是11111111,任然表示的是-1.
从byte到char 的转型略微麻烦,因为byte是有符号类型,char是无符号类型(表示一个字符16位)。在将一个整数类型转换为宽度更宽的整数类型是,通常是无损的(比如int转long),但是不可能用一个字符表示一个负的byte数值。因此通常认为从byte到char的转换不是一个拓宽基本类型转换,而是拓宽并窄化基本类型转换:byte先被转换为int,然后int再转换为char 。
这些看起来比较复杂,有这样一条规则来描述从较窄的整数类型转换成较宽的整形时的符号拓展行为:如果最初的数值类型是有符号的,就进行符号拓展;如果是char,不论要转换成什么类型都执行零拓展。用这个规则再来看从byte到char 的转换,byte是有符号类型,所以会进行符号拓展,11111111拓展为1111111111111111,转换为10进制数为65535.之后从char拓宽为int也是一个简单的拓宽基本类型转换。所以最终输出为65535.
java多重转型问题的更多相关文章
- Java表达式转型规则
Java表达式转型规则由低到高转换: 1.所有的byte,short,char型的值将被提升为int型: 2.如果有一个操作数是long型,计算结果是long型: 3.如果有一个操作数是float型, ...
- Java向上转型和向下转型(附具体样例)
Java向上转型和向下转型(附具体样例) 熬夜整理的关于Java向上和向下转型的样例,很的通俗易懂哦~~~~ 一 ...
- java 向上转型 向下转型
//父类 四边形 class Quadrangle{ public static void draw (Quadrangle q){ } } //子类 public class Parallelog ...
- Java向上转型的意义
比如我这个程序 public class Testjava{ public static void main(String args[]) { fun(new Student()); fun(new ...
- java 向上转型与向下转型
转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展. 向上转型:子类引用的对象 ...
- java向上转型和向下转型1
在java继承体系中,认为父类(超类)在上层,子类在下层(派生类) ,向上转型就是把子类对象转成父类对象. public class Father { public void eat(){ Syste ...
- (原)java 向上转型中,任何域的访问操作都是由编译器解析,不是多态
最近在向java发力,学习学习了下.看到了多态这一节,书中有个比较好的例子,所以就准备写下来,记录下来: package dynamic_binding01; public class dynamic ...
- java 向上转型和向下转型
学习向上转型和向下转型怎么用没多难,但是为什么那样用,我搞了很多次没弄明白.没弄明白的原因是平时学习时之看例子,而例子一般都比较简单,没有对象之间的调用,一般就是一个对象调用自己的方法. 首先看下怎么 ...
- java向上转型和向下转型
转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展. 向上转型:子类引用的对象 ...
随机推荐
- Webscoket
websocket: http://blog.csdn.net/xiaoping0915/article/details/78754482 很好的讲解了websocket ,还有一个小例子 ht ...
- c# 控制台应用程序批量修改文件夹下的后缀名(包括子文件夹)
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...
- 解决访问 jar 包里面的字体报错:OTS parsing error: incorrect file size in WOFF header
前言:jar 包里面的字体加载,浏览器 console 中报警告信息,这里记录一下解决方案. 附:自己的一个 jar 包源码 https://github.com/yuleGH/querydb 错误问 ...
- 理解Java异常
一.Java异常的简介 Java异常是Java提供的一种识别及响应错误的一致性机制.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器.Ja ...
- java设计模式-----22、状态模式
概念: State模式也叫状态模式,是行为设计模式的一种.State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样. 根据这个概念,我们举个例子 public c ...
- Three.js开发指南---使用高级几何体和二元操作(第六章)
本章的主要内容: 一,高级几何体-凸面体ConvexGeometry,扫描体LatheGeometry,管状几何体TubeGeometry: 二,使用拉伸几何体ExtrudeGeometry将一个二维 ...
- C# HmacSha512 与 java HmacSha512 加密
C# HmacSha512 与 java HmacSha512 加密. /// <summary> /// HmacSha512 加密 /// </summary> /// & ...
- python学习之老男孩python全栈第九期_day011知识点总结
# 装饰器的形成的过程:最简单的装饰器:有返回值的:有一个参数的:万能参数# 装饰器的作用# 原则:开放封闭原则# 语法糖# 装饰器的固定模式:# def wrapper(f): # 装饰器函数,f是 ...
- python 数据结构中的链表操作
链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就 ...
- CSS应用的小问题总结
1.两个元素换行书写时,在实际的布局中展示为两个元素之间多了一个区间(这个区间通常是因为代码在换行时,解析会自动默认为一个空格字符),所以在实际应用时,如果想要将两个元素完全无缝隙的放置在一起并排显示 ...