Java基本数据类型转换那些事

1.promotecast
promote:如果是负数,前面所有空位补1. 如果是正数,前面所有空位补0。
cast:截取低位的。

2.

int i = 0xffffffff;     //正常编译运行
System.out.println(i);  //0xffffffff默认为int型,若达到int型最高位,直接把16进制当做二进制,最高位为符号位

short s = 0xfffffff0;//可以正常编译运行,0xfffffff0默认为int型,虽然二进制占用32位,但是没有超出short表示范围。
System.out.println(s); 

//int i = 1;
//! short s = i;//但是这个编译会出错,因为i是变量,需要cast才行

long l = 0xffffffffL;  //字面值类型很重要,若不加L默认为int,则赋值给l的是-1。所以,如果想要表示的数超出了int型,则一定要加上L
System.out.println(l);

输出:-1
      -16
      4294967295

3.byte,char,short
这三种数据类型在进行任何数学运算或者位运算时,都会先被promote为int型再进行运算。

4 . a = a+1 和 a+=1

short a = 1;
//!a=a+1; 编译不能通过,因为进行a+1运算时,a首先被提升为int型,然后加1运算,得到的结果也是int型。
//所以需要强制转化才能赋给short型的a,应该这样写: a = (short)(a+1);
a+=1;  //可以正常编译运行。因为+=号会自动将结果强制转换为short型。

5.重载时数据类型的promote

(1)重载函数的参数只有一个时

public class Test{
    public static void f(short s){
        System.out.println("short");
    }
    public static void f(long l){
        System.out.println("long");
    }
    public static void main(String[] args){
        f(1);
        int a = 1;
        f(a);
    }
}
//output:
        long
        long

执行f(1)时,1是一个int型,传给f后先找是否有参数为int型的f函数,如果没有,则找比int的数据范围更大的数据类型,然后选择其中的最小的(这里比int数据范围更大的且最小的数据类型就是long)。

但是,需要注意一下char
[1]char是无符号16位的,short是有符号16位。因此在main函数中向f传入char型,且找不到定义的参数为char型的函数f时,接下来会去找是否有int型参数的函数,而不是short。
[2]有符号型byte和short不会被提升为无符号型char型。也就是说,如果在main中向f传入的是byte或者short类型,那么不应该考虑定义的参数为char型的f。

(2)重载函数的参数有多个时

public class TestClass {

    public static void f(int i1, short s){
        System.out.println("first");
    }
    public static void f(int i2, int i3){
        System.out.println("second");
    }
    public static void main(String[] args){
        short a = 1, b = 1;
        f(a,b);
    }
}//output:
          first       
  • 首先,a和b都是short型,所以先找f(short,short),没有这种的f。

  • 然后,找满足下列条件的f(如果找不到则编译错误):

    [1]定义的f的两个参数类型的数据范围都大于等于short
    [2]该f中定义的的两个参数类型的数据范围都小于等于其他f中的相应的参数类型的数据范围。(例子中第一个f的i1等于第二个f的i2的数据范围,且第一个f的s小于第二个f的i3的数据范围)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值