我们来看一个简单的问题,下面的代码会打印出什么?

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多重转型问题的更多相关文章

  1. Java表达式转型规则

    Java表达式转型规则由低到高转换: 1.所有的byte,short,char型的值将被提升为int型: 2.如果有一个操作数是long型,计算结果是long型: 3.如果有一个操作数是float型, ...

  2. Java向上转型和向下转型(附具体样例)

                                                Java向上转型和向下转型(附具体样例) 熬夜整理的关于Java向上和向下转型的样例,很的通俗易懂哦~~~~ 一 ...

  3. java 向上转型 向下转型

    //父类 四边形 class Quadrangle{ public static void draw (Quadrangle q){ } } //子类  public class Parallelog ...

  4. Java向上转型的意义

    比如我这个程序 public class Testjava{ public static void main(String args[]) { fun(new Student()); fun(new ...

  5. java 向上转型与向下转型

    转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展. 向上转型:子类引用的对象 ...

  6. java向上转型和向下转型1

    在java继承体系中,认为父类(超类)在上层,子类在下层(派生类) ,向上转型就是把子类对象转成父类对象. public class Father { public void eat(){ Syste ...

  7. (原)java 向上转型中,任何域的访问操作都是由编译器解析,不是多态

    最近在向java发力,学习学习了下.看到了多态这一节,书中有个比较好的例子,所以就准备写下来,记录下来: package dynamic_binding01; public class dynamic ...

  8. java 向上转型和向下转型

    学习向上转型和向下转型怎么用没多难,但是为什么那样用,我搞了很多次没弄明白.没弄明白的原因是平时学习时之看例子,而例子一般都比较简单,没有对象之间的调用,一般就是一个对象调用自己的方法. 首先看下怎么 ...

  9. java向上转型和向下转型

    转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展. 向上转型:子类引用的对象 ...

随机推荐

  1. [android] 新闻客户端实现左侧导航点击切换

    设置主布局文件,为根布局设置一个id,作为内容区 给ListView的条目设置点击事件,setOnItemClickListener()方法,参数:上下文 当前的Fragment实现OnItemCli ...

  2. PHP语法-该注意的细节

    php in_array(mixed $needle, array $haystack[, bool $strict = FALSE] ) 注意: 一.如果$needle 是字符串,则比较是区分大小写 ...

  3. springboot使用问题总结

    技术说明:eclipse+springboot+mysql+mybatis 问题一:应用访问报错:Access denied for user 'root'@'localhost' (using pa ...

  4. javaer有福了,基于Web的mysql数据库管理工具TreeSoft发布了。

    基于Web的数据库管理工具TreeSoft数据库管理系统发布快3年了,版本不断更快速迭代开发中,QQ群也积累了300多位粉丝,虽然时不时也掉粉,但总体还是增加中.大家虽然捐赠不多,但是苍蝇再小也是肉啊 ...

  5. 最新版本Bootstrap样式很奇怪(4.1版本)

    下载最新版4.1版的Bootstrap编译好的CSS,引入的样式及其怪异. 这种情况重新下载3.3.7低版本就可以了.

  6. How to write a professional email?

    Advantages and Disadvantages of Email communication compared with Face-To-Face communication:   Emai ...

  7. HDU2444(KB10-B 二分图判定+最大匹配)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  8. django-templates过滤器

    常用内置过滤器: 过滤器会更改量或便签参数的值: title过滤器: {{ django|title }} 在下列context中 {'django': 'the web framework for ...

  9. jQuery操作table数据上移、下移和置顶

    jQuery 操作table中的tr换行的步骤如下: 1.获取当前tr var $tr = $(this).parents("tr"); 2.移动tr //上移 $tr.prev( ...

  10. Linux 中 awk命令应用

    ls -la | awk '{printf ("%8s %8s %8s %8s %8s %8s %8s %8s %8s\n",$1,$2,$3,$4,$5,$6,$7,$8,sub ...