整数与浮点数类型运算与转换

核心点

  • 由于Java是最强类型语言,所以要进行有些运算的时候,需要用到类型转换

    低-------------------------------------------------------------------->高

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

    • 按字节大小排序不同类型运算兼容顺序
    • 这时候眼尖的同学就会问了,为什么float和double字节不是最大的为什么排在long之后呢?
      • 其实,在咱们运算当中,浮点数优先级是最高的。

强制转换

  • 运算中,不同类型的数据先转化为同一类型,然后进行运算

    咱们先来看一下下面图中代码图片

    上图咱们可以看到,b需要的类型是byte类型,但我们提供的值i为int类型,这样就会报错。那么接下来我们就需要给i提供一个强制转换代码转换为byte类型,如图

    图片

    这样i就被从int类型强制转换为byte类型进行运算了。那么接下来咱们进行打印这两个值看看是否正常运算

    图片

    接下来看打印结果

    图片

  • 我们可以看到这个打印结果却是超乎我们的意料,上图中i打印结果是128,但是b的打印结果却是-128,b的值是用i的值赋予的,打印的结果却是不一样的,这是为什么?

    我们之前有学过byte这个整数类型,我们打开Byte这个类后可以看到

    image-20240229153459792

    • byte类型最大值我们可以看到,只能容纳到127,我们却给它赋值了一个128,它自然就会出问题了。
  • 这时候就有人问了:那它不应该报错吗?

    首先,在Java的逻辑里,语法不出问题它在调试时是不会给你报错的,但是运算结果却和实际大不相同。回到-128的结果,这是因为它最大只能容纳127,我们赋值128就会导致它内存溢出完全变样子了,谁也不知道它会变成什么样,总而言之我们赋的值已经超过了它的内存大小。所以,在我们转换类型时,尽量避免内存溢出,因此,我们给值前面加入(byte)即为强制转换。

自动转换

  • 以上我们浅了解了一下强制转换的用法,但是我们还有一种转换类型为自动转换,那么什么是自动转换呢?接下来咱们看看打印这两个值

图片

​ 我们可以看到图中的语法它是没有报错的,那么我们打印出来看看是否有问题

  • 如图中所示,打印结果是没有任何问题的。因此,在数值赋值时不需要在值前面加强制转换字符的即为自动转换

区别与使用

  • 我们从以上知识点中已经知道了什么是强制转换与自动转换,那么我们应该怎么去使用它们呢?
    • 我们回到核心点可以看到我给大家标注出了类型的优先级,那么很简单了,在我们给不同类型赋值运算时,优先级高的转换到优先级低的类型时需要强制转换,反之让它自动转换即可。

注意点

  1. 不能对布尔值进行转换

  2. 不能把对象类型转换为不相干的类型

  3. 在将优先级高的转换到优先级低的类型时,需要强制转换,反之自动转换

  4. 转换时可能存在内存溢出或者在运算浮点数时出现精度问题

    以下代码举例

    打印结果为

    浮点数转为int时,精度会出现问题

补充 (char与int互转)

  • 我们上节课说到char类型在Unicode表内也是属于int表示,因此我们是否也能将他与寻常int进行运算呢?上代码

    打印结果为

    我们看到图中打印是没有任何问题的,这次我们运用的转换方式为自动转换 (char优先级比int低),接下来我们在打印时将d (int) 转换为char类型时,这时候我们就需要用到强制转换 (int优先级比char高),如图

    接下来我们看打印结果

    ‘a’的char编码为97,在d变量中我们给他+1,那么按顺序98既是b,因此,我们打印的时候的结果没有任何问题。当然,咱们也可以将整个char表打印出来,当然了,这是非常大的一个内容了。

JDK7新特性与溢出问题解决

  • JDK7新特性:数字之间可以使用下划线'_'进行分割

    • 例如:1000000000可以表示为10_0000_0000

      打印结果

      如图所示,此表示格式比较友好且不会对原本的值结果有任何影响

  • 溢出问题解决方法

    • 首先,我们来将这两个数进行运算

      我们来看一下打印结果

      算数好的同学已经发现了,本该打印结果为2000000000却打印出了很长的一串负数,问题很明显,计算时数值溢出了。这时候就会有同学就会想,那我们用long可以接受吗?

    • 那我们就来试试用long来接收是否能解决溢出问题

      让我们来看看打印的结果是否解决问题

      我们发现它还是这串负数,问题还是存在,而我们进行了一次无效的转换。为什么呢?

      • 因为我们代码中的money和years被我们定义为了int,因此它的运算结果默认为int,而我们提供的long类型赋值是在它运算完成后得出的这串负数后再转为long打印出来,所以这对结果是没有任何改变的。
    • 那么我们怎么来解决这个问题呢?

      我们来看看下面这串代码

      让我们打印出它的运算结果看看

      这样他的运算结果是不是就没有任何问题了。其实是因为上图代码中我们在他运算前已经将它们其中一个值强制转换为long类型,那么后面的运算结果也会转换为long,那么当long接收下它的结果时候,自然就不会有任何问题了。

posted @ 2024-02-29 17:32  阿俊学JAVA  阅读(31)  评论(0编辑  收藏  举报