JavaSE—数据类型转换、整数、浮点数、字符扩展

1.数据类型转换

long的数据是要加上后缀L或者l的,但是如果粗心大意忘记了呢?

可以看到是不会报错的,这是因为Java支持数据类型的转换

那如果将一个long类型的数据赋值给int类型的数据,又会怎么样呢?

可以看到,现在是报错了的。

可以思考一下,long类型的精度是比int类型的要高的,一个低精度的数据向高精度的数据转换,最多就是数据末尾加几个不影响数据的0,而高精度的数据向低精度的数据转换的话,却有可能会丧失掉一部分的数据,这样就不难明白了。

那如果我不在意那点损失呢?

咦?可以发现这种流氓办法是可以的!


在Java中,数据范围小的向数据范围大的数据转换,叫自动类型转换,也叫隐式类型转换

数据范围大的向数据范围小的数据转换,叫强制类型转换,也叫显示类型转换,需要指定需要转换的数据类型

图源于网络:为自动类型转换,逆向即为强制类型转换

  • 整数型向浮点型转换可以理解,char型向int类型转换会是什么结果呢?先留一个悬念,在文章后面的char类型扩展会提到。

2.数据类型知识点扩展

  1. 整型

    我们日常生活中使用的是十进制数据,整十进一,但是还有二进制数据,八进制数据,十六进制数据,对应的也都是整二进一,整八进一,整十六进一,那在Java程序中怎么表示这些进制的数据呢?

    二进制:0b开头

    八进制:0开头

    十进制:直接书写

    十六机制:0x开头

    public class DateTypeExtension {
    
        public static void main(String[] args) {
            //1.整数扩展
            int num1 = 0b10;   //二进制2
            int num2 = 010; //八进制8
            int num3 = 10;  //十进制10
            int num4 = 0x10;    //十六进制16
    
            System.out.println(num1);
            System.out.println(num2);
            System.out.println(num3);
            System.out.println(num4);
        }
    }
    

    查看此时的允许结果:可以看到是正确的

  2. 浮点型

    我们先来看一个有趣的东西,问你0.55-0.5等于多少,1秒钟你就能回答出0.05,但是程序的结果是0.05吗?

    public class DateTypeExtension {
    
        public static void main(String[] args) {
            //2.浮点数扩展
            double num1 = 0.55;
            double num2 = 0.5;
            double result = num1 - num2;
    
            System.out.println(result);
        }
    }
    

    居然不是0.05!!!

    这是因为啊,所有的数据在计算机中都是要转换成二进制的,但是浮点数的小数在转换的时候可能会存在舍入误差,这就导致结果也有误差(涉及到计算机组成原理知识,网上有很多关于Java浮点数计算误差的文章,本人水平尚有限,不能很好的解释,故不在此卖弄了~)

    这如果是涉及到钱的话,要么是你不乐意,要么就是银行不乐意了,所以涉及到像金融行业这种对数据计算结果要求极高的,就不能使用浮点数进行运算,Java也考虑到了这一个问题,所以有BigDecimal这种能够保证数据计算结果的数学工具类。(尚未涉及到类的学习,有兴趣可先自行查阅~)

    所以,最好完全避免使用浮点数进行运算比较

  3. 字符型

    在上述数据类型转换中,我们留下了一个问题:char类型的数据向int类型的数据强制转换会怎么样呢?

    public class DateTypeExtension {
    
        public static void main(String[] args) {
            //3.字符扩展
            char c1 = 'a';
            char c2 = '中';
    
            System.out.println((int) c1);
            System.out.println((int) c2);
        }
    }
    

我们来看看结果:的确输出了两个int类型的数据

原来啊,所有字符的本质还是数字

因为char类型涉及到编码问题,有一种编码叫Unicode,它可以处理各种语言的文字,占两个字节。

所以就有一张Unicode表,一个数字对应一个字符,向上述的97就是a,20013就是中国的中。

如果不想直接写a呢,我们也可以使用转义来表示,其范围为:U000-UFFF(十六进制)

//\为转义字符,即\之后的内容会被转换成别的意义
char c3 = '\u0061';
System.out.println(c3);

可以看到结果是a,因为0061的十六进制代表97,而在编码表中,97对应的就是字母a,所以输出了a


其它的转义字符:

\t:代表一个tab键的作用

\n:相当于换行

......(常用为这两个,其余可需要的时候百度)

//println是输出完内容会自动换行的,print是不会的

System.out.print("hello");
System.out.print("\tworld");
System.out.print("\n! ");

结果验证了\t为一个tab的作用,而\n是可以换行的。

所以在涉及到 \ 时要注意转义的问题。

posted @ 2021-01-12 12:30  deng-hui  阅读(405)  评论(0编辑  收藏  举报