Java的0xFFFF在赋值、比较时引起的困惑

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());		
	}
}

运行输出:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值