MAX#u值+;一,;MIN_VALUE-1适用于java的所有数据类型?

MAX#u值+;一,;MIN_VALUE-1适用于java的所有数据类型?,java,Java,对于byte&short=>无法从int转换为byte或short。 int=>最大值=最小值-1和最小值=最大值+1 float&double=>最大值=最大值+1,最小值没有顺序 有谁能解释一下这些数据类型是如何处理min-1和max+1值的,以及为什么会以不同的方式工作?不编译的行不编译,因为+和-是导致其操作数发生变化的两种运算符。这些规则是: 如果其中一个操作数的类型为double,则另一个操作数将转换为double 否则,如果其中一个操作数的类型为float,则另一个操作数将转换

对于
byte
&
short
=>无法从int转换为byte或short。
int
=>最大值=最小值-1和最小值=最大值+1
float
&
double
=>最大值=最大值+1,最小值没有顺序


有谁能解释一下这些数据类型是如何处理min-1和max+1值的,以及为什么会以不同的方式工作?

不编译的行不编译,因为
+
-
是导致其操作数发生变化的两种运算符。这些规则是:

  • 如果其中一个操作数的类型为double,则另一个操作数将转换为double

  • 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float

  • 否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long

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

因此,如果没有一个操作数是
double
float
long
,那么这两个操作数都将转换为
int
,代码就是这样。而
int
不能简单地转换为
字节
short

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

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);
    }
}
0111 1111 1111 1111 1111 1111 1111 1111
而最小值的二进制表示为:

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);
    }
}
0111 1111 1111 1111 1111 1111 1111 1111
现在,您可以看到如何将一个值添加到最大值中得到最小值,并从最小值中减去一个值得到最大值

对于
float
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\u value
Float.negative\u INFINITY
,这取决于您是否将无穷大计算为“数字”。

您所说的“最小值无顺序”是什么意思?我得到-1.0作为float和double的最小值1。实际上,我无法理解为什么不同的数据类型以不同的方式工作。Integer.MAX_VALUE+1?Float.MIN_值-1?嗯……多好的问题啊!