Java随笔:多重转型

下面这段代码的输出是什么?

System.out.println((int)(char)(byte)(-1));

这里做了3次转型,结果不是一下子看得出。

第一次,-1,int

第二次,?,byte:这里做了截断0xffffffff转成了0xff。

第三次,?,char:这里char是无符号,byte带符号。扩展时会带上符号位,结果是0xffff。

第四次,?,int:这里int带符号,但char是无符号。扩展时不会带符号位,结果是0xffff。

所以输出是65535,0xffff。

总结

在进行数值转换时,会出现“截断”和“扩展”。

  • 截断比较简单:保留低位
  • 扩展会根据当前类型进行判断:如果是带符号,比如byte,扩展时需要扩展符号位。如果不带符号,比如char,扩展时高位置0

实际开发中,需要根据自己的要求进行处理,比如加上掩码 & 0xff。确保结果根据满足自己的要求。

时间: 2024-12-25 15:08:05

Java随笔:多重转型的相关文章

学习java随笔第八篇:封装、继承、多态

java和c#一样都是面向对象的语言. 面向对象的语言有三大特征:封装.继承.多态 封装 封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别. class Person2 { private String name; public void setName(String name) { this.name=name; } public String getName() { return name; } private String sex; public voi

学习java随笔第七篇:java的类与对象

类 同一个包(同一个目录),类的创建与调用 class Man{ String name; void GetMyName() { System.out.println(name); } } public class Person { public static void main(String arges[]) { Man m=new Man(); m.name="小黄"; m.GetMyName(); } } 运行结果 不同的包(不同目录目录),类的创建与调用 package Peo

学习java随笔第六篇:数组

一维数组 创建一维数组并输出 public class OneDimensionalArray { public static void main(String argas[]) { int i[]=new int[10]; for(int j=0;j<i.length;j++) { i[j]=j; System.out.println(i[j]); } } } 多维数组 创建多维数组并输出 public class MultiDimensional { public static void m

学习java随笔第九篇:java异常处理

在java中的异常处理和c#中的异常处理是一样的都是用try-catch语句. 基本语法如下 try { //此处是可能出现异常的代码 } catch(Exception e) { //此处是如果发生异常的处理代码 } finally语句 try { //此处是可能出现异常的代码 } catch(Exception e) { //此处是如果发生异常的处理代码 } finally { //此处是肯定被执行的代码 } 抛出异常 使用thows和throw语句抛出异常 public static vo

Atitit. Java script 多重多重catch语句的实现and Javascript js 异常机制

Atitit. Java script 多重多重catch语句的实现and Javascript js 异常机制 1. 语法错误(ERROR)和运行期错误(Exception) 1 2. 错误类型判断 二种方法: 1 3. 我们常接触到的异常包括: 2 4. ------代码 2 5. 参考 4 1. 语法错误(ERROR)和运行期错误(Exception) Javascript提供了两种特殊的错误处理方式 BOM包含一个onerror事件处理函数,这个window对象与图像对象上都有 同时EC

Java向下转型的意义

一开始学习 Java 时不重视向下转型.一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型. 其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型也比较好理解. 但是向下转型,会不会觉得很傻,我是要用子类实例对象,先是生成子类实例赋值给父类引用,在将父类引用向下强转给子类引用,这不是多此一举吗?我不向上转型也不向下转型,直接用子类实例就行了. 我开始学习Java时也是这么想的,这误区导致我觉得向下转型就是没用的. 随着技术的提升,我在看

Java 随笔

Java 随笔 @purpose:随手记下基础的一些知识,这些知识都是自己以前没怎么注意的基础知识,加深印象 1. static 方法:静态方法中只能引用外部的静态属性 2. this关键字: this 关键字是不能在 static 方法或者 static 代码块中使用的 原因:static 类型的方法或者代码块是属于类本身而不属于某个对象,this 本身就代表着当前类对象,然而静态方法或者块调用的时候是不用初始化对象的. 3. 异常处理: 问题:在程序猿编码时,常常要进行异常处理,不过处理异常

学习java随笔第十一篇:java窗体程序

要开java的窗体程序,就要下载开发窗体的工具. 这里我用的是的myeclipse,可以直接在网上下载安装即可. 我用的是10.0版本的,如果需要汉化的话,可以看一下这篇文章:myeclipse.10安装和汉化方法 java窗体 package java20130629; import javax.swing.*; public class Form extends JFrame { public Form() { this.setLayout(null); JLabel jl=new JLab

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...11