Java中类型强转:int 转byte

群里有人问了个问题:

		int a =234;
		byte b = (byte)a;
		System.out.println(b); 

因为Java中基本类型的范围不同,强转可能会导致异常。

Java中的基本类型

java中所有的基本数值类型都有正负号,所以不要去寻找无符号的数值类型。

基本类型大小最小值最大值包装器类型
boolean----
char16-bit  Character
byte8 bits-128127Byte
short16 bits-2^152^15-1Short
int32 bits-2^312^31-1Integer
long64 Bits-2^632^63-1Long
float32 bitsIEEE754IEEE754Float
double64 bitsIEEE754IEEE754Double
void---Void

高精度数字: 
- BigInteger 支持任意精度的整数 
- BigDecimal 支持任何精度的浮点数

再回来看看这个,java的这种从高往低转是粗暴的截断。

相关二进制概念:

原码对于二进制数,最高位为符号位,0表示正数,1表示负数,剩余数值部分是真值。

计算机中存储、处理、运算的数据通常是8位、16位、32位或64位的,这里以最简单的8位为例讲解。
注意符号位是包含在8位中的其中1位,故可直观读出的数只有7位(只有后7位数可以按权展开)。它只能表示255种状态,
因此原码的表示范围成了-127到+127,在补码中10000000被用来表示-128。

反码:(对1求补)

用原码求反码的方法是,正数不变,负数保留符号位1不变,剩下位按位取反

补码:(对2求补)

是正数依旧不变,负数保留符号位不变,先求反码再加上1。(为啥这样运算可以看下相关介绍)

理解为一个32bit 截取为8 bit,再经历一次求补码的过程

234 对应32bit二进制 1110 1010.

截取8bit理解,第一位为符号位,所以是负的, 数据位110 1010,求 补码(反码:0010101,加1=0010110)后

为0010110(对应十进制22),加上第一位的符号位1负数。所以为-22.

同理:计算300转换过程:32bit 为 1 0010 1100,截取了8bit:0010 1100。对应的补码数据:44

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值