首页 > 解决方案 > MAX_VALUE+1 & MIN_VALUE-1 如何与java的所有数据类型一起工作?

问题描述

public class Min_Max{
    public static void main(String[] args){
        //byte max & min
        // byte maxByte=Byte.MAX_VALUE;
        // byte maxByte_add1=Byte.MAX_VALUE+1;//Cannot convert from int to byte
        // byte minByte=Byte.MIN_VALUE;
        // byte minByte_sub1=Byte.MIN_VALUE-1;//Cannot convert from int to byte
        // //short max & min
        // short maxShort=Short.MAX_VALUE;
        // short maxShort_add1=Short.MAX_VALUE+1;//Cannot convert from int to short
        // short minShort=Short.MIN_VALUE;
        // short minShort_sub1=Short.MIN_VALUE-1;//Cannot convert from int to short
        //integer max & min
        int maxInt=Integer.MAX_VALUE;
        System.out.println("Integer max value :"+maxInt);
        int maxInt_add1=Integer.MAX_VALUE+1;
        System.out.println("Max+1 :"+maxInt_add1);
        int minInt=Integer.MIN_VALUE;
        System.out.println("Integer min value :"+minInt);
        int minInt_sub1=Integer.MIN_VALUE-1;
        System.out.println("Min-1 :"+minInt_sub1);
        //float max & min
        float maxFloat=Float.MAX_VALUE;
        System.out.println("Float max value :"+maxFloat);
        float maxFloat_add1=Float.MAX_VALUE+1;
        System.out.println("Max+1 :"+maxFloat_add1);
        float minFloat=Float.MIN_VALUE;
        System.out.println("Float min value :"+minFloat);
        float minFloat_sub1=Float.MIN_VALUE-1;
        System.out.println("Min-1 :"+minFloat_sub1);
        //double max & min
        double maxDouble=Double.MAX_VALUE;
        System.out.println("Double Max value :"+maxDouble);
        double maxDouble_add1=Double.MAX_VALUE+1;
        System.out.println("Max+1 :"+maxDouble_add1);
        double minDouble=Double.MIN_VALUE;
        System.out.println("Double Min value :"+minDouble);
        double minDouble_sub1=Double.MIN_VALUE-1;
        System.out.println("Min-1 :"+minDouble_sub1);
    }
}

![OUTPUT] For byte& short=>无法从 int 转换为 byte 或 short。 int=>最大值=最小值-1,最小值=最大值+1 float& double=>最大值=最大值+1,最小值没有顺序。

谁能解释这些数据类型如何用于 min-1 和 max+1 值以及为什么以不同的方式起作用?

标签: java

解决方案


不编译的行不编译,因为+和是导致其操作数经历二进制数字提升-的那些运算符中的两个。规则是:

  • 如果任一操作数是 double 类型,则另一个操作数将转换为 double。

  • 否则,如果任一操作数的类型为浮点型,则另一个将转换为浮点型。

  • 否则,如果任一操作数是 long 类型,则另一个将转换为 long。

  • 否则,两个操作数都转换为 int 类型。

因此,如果没有一个操作数是double,floatlong,那么两个操作数都将转换为int,就像您的代码一样。并且int不能被隐式转换为byteor short

的最大值int等于int减一的最小值,因为这就是二进制补码的工作原理。最大值的二进制表示为:

0111 1111 1111 1111 1111 1111 1111 1111

而最小值的二进制表示是:

1000 0000 0000 0000 0000 0000 0000 0000

您现在可以看到如何将最大值加一给出最小值,从最小值中减去一给出最大值。

对于floatand double,max value = max value + 1 的原因基本上是它们不够精确,无法表示 max value + 1 的值。请参阅浮点数学是否损坏?结果被四舍五入到最接近的可表示值,恰好是最大值。在语言规范中可以找到更精确的描述:

如果和的大小太大而无法表示,我们说操作溢出;结果是无限的适当符号。

否则,总和将使用 IEEE 754 舍入到最近模式四舍五入到所选值集中的最接近值。Java 编程语言需要支持 IEEE 754 (§4.2.4) 定义的逐渐下溢。

对于为什么最小值 - 1 是 -1.0,好吧,看看最小值实际上是什么。对于float, 它是1.4E-45一个非常接近于 0 的数。那么当你从一个略大于 0 的数中减去 1 会发生什么?你得到大约-1!同样,float不能double精确地表示这个几乎为负的数字,所以它显示为 -1.0。

您可能会误解Float.MIN_VALUE为可以拥有的最负面的价值Float,但这不是它的意义所在。Float可以有的最负值是-Float.MAX_VALUEFloat.NEGATIVE_INFINITY,这取决于您是否将无穷大视为“数字”。


推荐阅读