01.Java中整形表示方法
十进制:默认,eg:int a=8;
八进制:0**, eg:int b=010;
十六进制:0x**,eg:int c=0x08;
二进制(JDK8版本以上支持):0b**,eg:int d=0b10;
02.关于类型转换
2.1JAVA中整数类型的字面量被默认为 int 型, 当声明变量为long型时需要需要在后方加 l 或 L
EG: long b=1000L;//不存在类型转换,因为已经手动将字面量转换为long型。
System.out.println(b);//此处不存在类型转换,1000L已经手动得将类型转换为long型2.2如下图所示定义,会报错!需要手动加 L 将字面量改为 long 型
long d=2147483648;
"此处字面量已经大于int得最大值,而不加L默认int,所以报错"
"错误信息:”IntTest1.java:16: 错误: 整数太大"2.3类型转换—— 向上转型
可以自动调整
long c=200;
"//200被默认为int型字面量,所以存在类型转换"
"//int类型占4个字节,long类型占八个字节,小容量可以自动转换成大容量"
System.out.println(c);"//所以上方不加L也可。它自己进行了类型转换。"2.4类型转换——向下转型
需要手动调整,使用强制转换
long i=100000L;
"//int l=i;// 报错——不兼容的类型: 从long转换到int可能会有损失"
int l=(int)i; "//long类型的i的二进制储存方式为"
"//00000000 00000000 00000000 00000000"
"//00000000 00000001 10000110 10100000"
"//使用强制类型转换符号后砍掉前4个字节为:00000000 00000001 10000110 10100000"
所以在此处不存在精度损失,但当long四个字节以上不为零,强制转换会损失前四个字节的数据。
强制转换弊端1: 如下图变会产生精度损失
public class IntTest2{
public static void main(String[] args){
byte a=(byte)300;
"//byte最大127,会产生精度损失"
System.out.println(a);//输出结果为44"
"//默认int型的字面量100的存储方式为"
"//00000000 00000000 00000001 00101100"
"//byte为1个字节,强制转换为00101100=44"
}
}强制转换弊端2:
/*
1.计算机只能识别二进制
2.计算机底层存储为二进制的补码形式
源码 反码 补码
(1).对于正数来说,源码、反码、补码完全一致
int a=1;
原:00000000 00000000 00000000 00000001
反:00000000 00000000 00000000 00000001
补:00000000 00000000 00000000 00000001
(2).对于负数来说
byte b=-1;
对应的二进制源码: 10000001
反码(符号不变,其余取反):11111110
补码 :11111111
*/
public class intTest3{
public static void main(String[] args){
//byte b=150;不能直接通过,大专小需要强制转换
byte b=(byte)150;
//分析:150默认int型,为4个字节,在计算机中以补码方式存在
//00000000 00000000 00000000 10010110
//强制转换后为:10010110(补码)
//反码:10010101;源码:11101010=-106
System.out.println(b);
}
}2.5 Java语法中有一机制:当整形字面量没有超过声明类型 的取值范围那么这个整形字面量可以直接赋给所声明的类型,(个人理解,sun公司不承担精度损失的责任,需要编写者手动调整)
public class IntTest2{
public static void main(String[] args){
byte a=(byte)300;
"//300默认当作int型,b变量为byte型,"
"//大容量转小无法自动转换"
"//byte最大127,会产生精度损失"
System.out.println(a);
"//输出结果为44"
"//默认int型的字面量100的存储方式为"
"//00000000 00000000 00000001 00101100"
"//byte为1个字节,强制转换为00101100=4"
byte b=1;
System.out.println(b);
"//java中有一特殊机制,当整形数值小于byte最大值时可以直接赋值,不做类型转换"
short c=1;
System.out.println(c);
byte d=(byte)128;
System.out.println(d);
}
}另:byte\short\char混合运算时会将数据先转换为int型
public class test2{
public static void main(String[] args){
char b1='a';
byte b=1;
System.out.println(b+b1);//输出得98
//short,long,byte做混合运算时,先转换为int型再运算
//short s=b+b1;//此句报错,右边是int型
short s=98;//此句不报错
//这是因为编译器只能检测到第一句是加法运算,不知结果,只知道是int型
//而第二句可以清楚得看到数值为多少
//short s=(short)b+b1;编译报错,因为只把b转换为short型,b1还是int型。
short s=(short)(b+b1);
int a=1;
short c=a;// 错误: 不兼容的类型: 从int转换到short可能会有损失
short c=1;//不报错,因为编译器只能检查语法判断右方为int型,而不能判断是否数值超过short得最大值
}
}版权声明:本文为qq_45233518原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。