java中整数型字面值被默认当做int
型来处理。
如果要这个整数型字面值被当做long
类型来处理的话,需要在整数型字面值
后面添加l或L
(建议大写)
整数型字面值有三种表示方式
十进制(默认)
八进制 (需要以0开始)
十六进制(需要以0x开始)
int a=10; 输出10
int b=010; 输出8
int c=0x10; 输出16
默认的输出也是以十进制输出的
int i =123 //i是int类型,123也默认是int类型,之间赋值不存在类型转换
long x=456 //x是long类型(大容量),456是int类型(小容量),存在类型转换
小容量可以自动转换为大容量,称为`自动转换机制
java看到数字就会自动认为是
int`类型,占用4个字节,那么后面的数字就不能够超过int类型的最大(127)
long z=12345565 就不行,因为12345565超出了int的范围
long z=12345565L,直接把12345565认为是Long类型就可以
大容量不能直接赋值给小容量,需要强制类型转换
需要`强制类型转换符`
==可能损时精度==
long x=100L;
int y =x; 在编译上就不能实现
int y=(int)x; 编译可以通过
源数据long x 100L 二进制形式是
00000000 00000000 00000000 00000000 00000000 00000000 00000000 01100100 (8字节,64位)
转换后数据 int y 二进制是
00000000 00000000 00000000 01100100 (4字节,32位)
long k =2147483648L; (int最大只到2^31-1是2147483647 ,超过了这个范围就会有精度损失)
int e =(int)k;
System.out.println(e); 结果是-2147483648(是-2^31)
源数据是 00000000 00000000 00000000 00000000 10000000 00000000 00000000 00000000
强制转换后的数据是 10000000 00000000 00000000 00000000 存在计算机里是一个补码形式,把这个补码转换为源码就是最终结果
(就已经占用到符号位了)
大容量到小容量
但只要数字没有超过byte
范围就可以不加强制转换符(仅限byte、short,char类型)
byte b=(byte)50; byte是1字节,8位,最大到127这里的‘(byte)’其实加不加都可以
byte c=127 ;也对
byte d=128; 不行128超过了byte的范围
大容量到小容量,如果超出范围,一定要强制类型转换符
byte d=(byte)128可以,但是一定会损失精度
这个时候输出的是-128
原数据 00000000 00000000 00000000 10000000(int型)
转换完 10000000(是一个补码)
减一
01111111
反码
10000000 128
原码:-128
8位的二进制本来就不存在正128的表示方法
10000000就是-128虽然128的二进制是10000000
short,byte,char如果没有超过取值范围也可以直接转换(因为精度没有损失)
int不管有没有超过都不行,都必须要强制转换