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?嗯……多好的问题啊!