自动类型提升

前景提要

1 12 123 1234 这类纯整数都是默认为int类型,超过int类型范围~2147483647的数字需要强制转换才能赋值给变量。

①当我们遇到超过int范围的情况时则会触发运算溢出(最大值+1=最小值 ,最小值-1=最大值),例如

public class Test1{
    public static void main(String[] args){
	int max = 2147483647;
	int min = -2147483648;
	System.out.println(max+1);//输出结果为-2147483648最小值
/*  max+1本质是int + int ,结果还是int,用int范围的补码进行运算 */
	System.out.println(max+2);//输出结果为-2147483647次最小值
	System.out.print(min-1);//输出结果为2147483647最大值
    }
}


究其根本是计算机的运算实际上是补码的运算,源码→反码→补码+1or+2之后得到一个补码,这个补码转换为源码就是输出结果,这里int类型位数太多不举例子,下面有byte类型的举例。

②当强制转换为byte类型的时候,有两种情况

        第一种是输出运算结果的对象

        第二种是输出运算结果

第一种:print()中是变量 而不是表达式

public class Test1{
	public static void main(String args []){
		int a = 127;
		int b = -128;
		byte max = (byte) a;
		byte min = (byte)b;
	int c=1;
	
		byte plus =(byte) c;
//中间是多加的一段。。。。。用于把运算结果封装成对象
	byte max1 =(byte) (max + plus);
	byte max2 =(byte) (max + plus * 2);
	byte min1 = (byte)(min - plus);
//中间是多加的一段。。。。。用于把运算结果封装成对象
	System.out.println(max1);//结果为-128
	System.out.println(max2);//结果为-127
	System.out.println(min1);//结果为127
}
}

由此可见,只有把运算结果封装成byte的一个对象再进行输出才能得到溢出的结果(最大值+1=最小值,最小值-1=最大值)(第一种)。

第二种 print()中是表达式 而不是变量

public class Test1{
	public static void main(String args []){
		int a = 127;
		int b = -128;
		byte max = (byte) a;
		byte min = (byte)b;
	int c=1;
	
		byte plus =(byte) c;
	System.out.println(max+plus);//结果为128
	System.out.println(max+plus*2);//结果为129
	System.out.println(min-plus);//结果为-129
}
/*补充:如果单独声明一个byte m = max + plus 会报错,
        把max + plus整个表达式作为输出则不会报错*/

()内是byte+byte 结果应该是byte类型,按理说应该会触发溢出机制,然而并没有。

由此可见,并没有正常的触发溢出机制,而是把 表达式byte类型的结果 偷偷转化成了 int 类型进行输出。

但这种“未触发溢出机制”的情况仅出现在“向下强制转换”(int转byte),当我们进行“向上强制转换”(int转long)则会正常触发溢出机制,如下:

public class Test1{
	public static void main(String args []){
		long a = 2147483647;
		long b = -2147483648;
		int max = (int) a;
		int min = (int)b;
	int c=1;
	
		byte plus =(byte) c;
	System.out.println(max+plus);//结果为-2147483648
	System.out.println(max+plus*2);//结果为-2147483647
	System.out.println(min-plus);//结果为2147483647
}
}

print()中int + byte结果是int类型,并且正常触发了溢出机制

  总结:

    自动提升:

当容量小(不是字节大小)的数据和容量大的数据进行运算时(+ - * / % =),自动把结果提升为容量大的数据类型

byte、char、short-->int-->long-->float-->double

其中byte char short 三者之间的运算结果自动转换为int类型,需要用int来装结果变量

理解:byte char short之间的运算很容易算着算着就超了,所以干脆设置为结果都为int类型,并且byte+byte   char+char   short+short三者的结果都是int类型

public class Test1{
	public static void main( String [ ]  args ){
	char c1 = 'a';
	short s1 = 32;
	System.out.print((char)(c1-s1));//输出A
	
}
}
public class Test1{
	public static void main( String [ ]  args ){
	char c1 = 'a';
	short s1 = 32;
	System.out.print(c1-s1);//输出65
	
}
}

补充:

long a = 128;✔

long a = 5616351823;✖  5616351823l✔ 5616351823L✔

float b = 12.3✖ 即使是在范围内也不行,因为浮点数默认为double类型,正确写法是在末尾加F或者f

方法重载的自动类型提升

public class Test1 {
	public static void main(String[] args) {
		
Test1 sb1 = new Test1();
	sb1.tell(1,1);
	}
//方法定义
//public void tell(int i ,int j){
//		System.out.println(1);
//	}
	public void tell(double i,double j){
		System.out.println(2);
	
	}
}

1,1判定为int类型,在方法重载中寻找int类型的,如果有则执行,如果没有则执行自动类型提升为double的重载

执行结果:不注释掉:1

                  注释掉:2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值