final byte[] datas = {(byte)0xaa };
byte aa= 0xff; 用int表示为-1
内存里的数是用补码存储的
正数的补码=正数本身
负数的补码=负数的绝对值按位取反后再加1
char duan定义的是一个字节的有符号数
0xff在内存中是11111111,最高位是1,说明是负数
按负数补码的定义,11111111-1=11111110
再按位取反=00000001
最后前面加是“-”,结果为-1
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中的基本类型的强制转换都是非常粗暴的,对于浮点型转为整型,都进行非常粗暴的截尾,对于多位数转换为少位数,也只是截断,根本不做舍入和约算。所以就有了下面的结果。
基本类型的强制转换典型笔试面试题
package primitiveType;
public class ByteTrancute {
public static void main(String[] args) {
// TODO Auto-generated method stub
byte a=(byte)127;
byte b=(byte)128;
byte c=(byte)100;
int x=0xff;//255
byte d=(byte)x;
x=0x80;//128
byte f=(byte)x;
c=(byte)(c*3);
System.out.println(a+" "+b+" "+c+" "+d+" "+f );
}
}
输出:
127 -128 44 -1 -128
分析
复习二进制的知识
原码
对于二进制数,最高位为符号位,0表示正数,1表示负数,剩余数值部分是真值。
反码
对于二进制数,正数的反码就是它本身,负数的反码除符号位外按位取反。
补码
对于二进制数,正数的补码就是它本身,负数的补码符号位取一,数值部分按位取反后末位加一。
由补码求真值,就是由补码求原码
正数:补码即原码
负数:按位取反,末位加一。相当于再求一次补码。
如:
1000 0000 计算得 1 0000 0000 视为-128
1111 1111 计算得 1000 0001 即系-1
0111 1111 就是正值 127
所以,以上的代码中的类型强制转换结果为:
int | 32bits二进制 | 截成8bits后 | byte |
---|---|---|---|
127 | 0111 1111 | 0111 1111 | 127 |
128 | 1000 0000 | 1000 0000 | -128 |
255 | 1111 1111 | 1111 1111 | -1 |
127 | 0111 1111 | 0111 1111 | 127 |
300 | 01 0010 1100 | 0010 1100 | 44 |