Java中的0xFFFF是整型,在赋值、比较的时候容易引起混淆,涉及到符号位、数值大小,赋值给什么类型的变量。我今天在编码的时候就遇到了一些困惑。用代码样例的形式记录下来,加深理解:
package com.thb;public class Test3 {public static void main(String[] args) {/** 编译器认为0xFFFF作为正数,将这个正数赋值给short类型的变量,超过了* short类型最大正数表示的范围。* 1)加上(short)类型强制转化,这个其实是改变了原数数值的大小(数值的大小变为1),* 也改变了符号位了(由正数变为负数了),即s变量保存的值是-1 (计算机用2的补码保存)*/short s = (short)0xFFFF;// 打印结果出来是负数(-1)System.out.println(s);// 结果为true,因为0xFFFF强制类型转换后变为负数了System.out.println(s == (short)0xFFFF);// 结果为false,因为s存放的是负数,而0xFFFF是正数System.out.println(s == 0xFFFF); // s存放的是负数,转换为int型的十六进制数,s的前面补两个字节的符号位,// 符号位是1,所以前面补的两个字节是0xFFFFSystem.out.println(Integer.toHexString(s).toUpperCase());// 0xFFFF是int型正数,在int的正数表示范围内,所以打印出来数值大小和符号位都没有改变System.out.println(Integer.toHexString(0xFFFF).toUpperCase());System.out.println("---------------------------");// 再举另外一个例子,将0xFFFF赋值给int型的变量,因为0xFFFF在int型最大正数// 表示的范围内,所以原数值大小和符号位都没有改变int ss = 0xFFFF; System.out.println(ss);System.out.println(ss == 0xFFFF); // 结果为true// ss是正数,前面两个字节的符号位都是0System.out.println(Integer.toHexString(ss).toUpperCase()); }
}
运行输出: