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,所以前面补的两个字节是0xFFFF
System.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是正数,前面两个字节的符号位都是0
System.out.println(Integer.toHexString(ss).toUpperCase());
}
}
运行输出: