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

来源:互联网 发布:天涯明月刀 知乎 编辑:程序博客网 时间:2024/05/22 16:38

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型,则一定要加上LSystem.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
原创粉丝点击