群里有人问了个问题:
int a =234;
byte b = (byte)a;
System.out.println(b);
因为Java中基本类型的范围不同,强转可能会导致异常。
Java中的基本类型
java中所有的基本数值类型都有正负号,所以不要去寻找无符号的数值类型。
基本类型 | 大小 | 最小值 | 最大值 | 包装器类型 |
---|---|---|---|---|
boolean | - | - | - | - |
char | 16-bit | Character | ||
byte | 8 bits | -128 | 127 | Byte |
short | 16 bits | -2^15 | 2^15-1 | Short |
int | 32 bits | -2^31 | 2^31-1 | Integer |
long | 64 Bits | -2^63 | 2^63-1 | Long |
float | 32 bits | IEEE754 | IEEE754 | Float |
double | 64 bits | IEEE754 | IEEE754 | Double |
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