(int)(char)(byte)-1;//结果是65535
(int)(short)(byte)-1;//结果是-1
(int)( ((char)(byte)-1) | 0xffff0000);//-1
byte[8bits],short[16bits],int[32bits],long是signed[64bits],而char[16bits]是unsigned。
窄类型转换为宽类型的规则是:
1 如果窄类型是signed,则符号位扩展到高位
2 如果窄类型是unsigned,则0扩展到高位。
综合成一句:
窄类型转换为宽类型,符号位会扩展到高位。
宽类型转换为窄类型,直接除去高位。
为了避免一些出乎意料的符号位扩展,可以在代码中明确是否扩展。
byte[] b = new byte[]{(byte) 0xdf}; int a2 = b[0]; System.out.println(Integer.toHexString(a2));//ffffffdf System.out.println(Integer.toHexString(a2 & 0xff));//df
If you are converting from a char value c to a wider type and you don't want sign extension, consider using a bit mask for clarity, even though it isn't required:
int i = c & 0xffff;
Alternatively, write a comment describing the behavior of the conversion:
int i = c; // Sign extension is not performed
If you are converting from a char value c to a wider integral type and you want sign extension, cast the char to a short, which is the same width as a char but signed. Given the subtlety of this code, you should also write a comment:
int i = (short) c; // Cast causes sign extension
由byte扩展成char,会导致符号位扩展,char不会得出我们想要的效果,因此我们需要人工去掉扩展。原理是利用b和整数0xff做与操作,返回宽类型int,去掉了高位的符号位,最后再缩窄为char类型。
If you are converting from a byte value b to a char and you don't want sign extension, you must use a bit mask to suppress it. This is a common idiom, so no comment is necessary:
char c = (char) (b & 0xff);
If you are converting from a byte to a char and you want sign extension, write a comment:
char c = (char) b; // Sign extension is performed
The lesson is simple: If you can't tell what a program does by looking at it, it probably doesn't do what you want. Strive for clarity.
相关推荐
java基础数据类型实例。数据类型在**数据结构**中的定义:一组性质相同的值的集合以及定义在这个值集合上的一组操作的总称。 所以我们要编写程序,就要捣鼓数据结构,数据结构的最基本组成就是基本数据类型。
Java Primitive 与 Reference 类型详解 Java 作为一种面向对象的语言,数据类型可以分为两类:Primitive 类型和 Reference 类型。Primitive 类型包括数字和布尔类型,不被看做对象,而是被称为基本类型。Reference ...
在"JAVA-type.rar_java Type"压缩包中,重点讲解的是Java的基本数据类型转换,这包括了数值类型之间的转换以及基本类型与包装类的转换。 一、Java基本数据类型 1. 整型(Integer Types):byte(1字节)、short(2...
在JavaScript开发中,"创建一个字符串的primitive表示"这一话题主要涉及到JavaScript中的字符串类型和它的基本操作。在JavaScript中,字符串是不可变的,这意味着一旦创建,就不能改变其内容。以下是一些关于创建和...
JavaScript_面試_基本資料型別和參考資料型別_Primitive_Data_Type_&_Reference_Data
i8086.DLL文件下载,解决找不到i8086.DLL的问题
Primitive Specializations Generator (JPSG) 是一个模板处理器,其主要目标是生成专用于任何 Java 基元类型和对象(泛型)类型的代码,而 Java 没有基元上的泛型。 的源代码是用 JPSG 生成的。 JPSG 与支持其他 ...
java编程基础,Java primitive data types and related subjects, such as variables, constants, data types, operators, and expressions. Control statements Array String
"Cesium撒点封装(Primitive)"是一个项目,它展示了如何利用Cesium的底层功能来实现高效的点云渲染,这对于地理信息系统(GIS)和大数据可视化非常有用。在本项目中,开发者已经对Cesium的`Primitive`类型进行了封装...
* 变量类型:基本类型(primitive type)、引用类型(reference type)和复杂类型(complex type)的声明和使用。 * 运算符:算术运算符、比较运算符、逻辑运算符、赋值运算符等的使用和优先级。 * 控制结构:顺序...
Java 对象序列化和 ObjectOutStream Java 序列化是一种将对象图表示为字节序列的机制,直接支持原始数据类型作为对象的一部分。原始类型的包装类也实现了 Serializable 接口,因此也可以进行序列化。通常情况下,将...
8086处理器是英特尔公司推出的一种16位微处理器,它是早期个人计算机的重要组成部分,对现代计算机技术的发展产生了深远影响。在这个名为"8086_proteus_all"的压缩包中,包含了与8086微处理器相关的各种芯片在...
Java中的“Primitive Collections for Java”(PCJ)是一个开源项目,旨在为Java编程语言提供针对原始数据类型的集合框架。这个框架弥补了Java标准库中集合类不直接支持原始类型(如int, double, char等)的不足,...
数组可以是 primitive type(基本数据类型)或对象。数组的声明格式为: Copy 数据类型[] 数组名 = new 数据类型[数组大小]; 例如: Copy int[] scores = new int[5]; 数组可以使用索引访问元素,例如:scores[0] ...
- `Type`: 表示各种类型的类型,包括`PrimitiveType`(如`boolean`, `int`等)和`RefType`(如类、接口、枚举等)。 - `Method`和`Constructor`: 分别代表方法和构造函数。 - `Variable`: 表示变量,可以是类、...
* Primitive type:基本类型 * Integer:整数类型 * Float:浮点数类型 * Double:双精度浮点数类型 * Char:字符类型 * String:字符串类型 * Boolean:布尔类型 * Array:数组类型 三、控制结构 * Conditional ...
2. Java变量和数据类型:Java中的变量可以是基本数据类型(primitive type)或引用类型(reference type)。在测试题2中,Student.java文件中定义了private变量name,类型为String。 二、Java编程语言 1. Java方法...