java - 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 值以及为什么以不同的方式起作用?
解决方案
不编译的行不编译,因为+
和是导致其操作数经历二进制数字提升-
的那些运算符中的两个。规则是:
如果任一操作数是 double 类型,则另一个操作数将转换为 double。
否则,如果任一操作数的类型为浮点型,则另一个将转换为浮点型。
否则,如果任一操作数是 long 类型,则另一个将转换为 long。
否则,两个操作数都转换为 int 类型。
因此,如果没有一个操作数是double
,float
或long
,那么两个操作数都将转换为int
,就像您的代码一样。并且int
不能被隐式转换为byte
or short
。
的最大值int
等于int
减一的最小值,因为这就是二进制补码的工作原理。最大值的二进制表示为:
0111 1111 1111 1111 1111 1111 1111 1111
而最小值的二进制表示是:
1000 0000 0000 0000 0000 0000 0000 0000
您现在可以看到如何将最大值加一给出最小值,从最小值中减去一给出最大值。
对于float
and 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_VALUE
或Float.NEGATIVE_INFINITY
,这取决于您是否将无穷大视为“数字”。
推荐阅读
- c# - CustomValidator ServerValidate 事件未触发
- javascript - 表单提交后如何开始自动下载pdf
- javascript - 如何重叠两张图片,旋转顶部的一张,只显示其中的一部分?
- javascript - Bootstrap:如何添加指向导航选项卡的链接
- javascript - 强制第二个 HTML5 日期输入打开与第一个输入相同的月份
- reactjs - React paste eventListener调用自定义函数使用初始化变量值而不是更新值
- python - 无法在 Django 中使用 cursor.execute() 写入 Db - 此子句的布尔值未定义错误
- css - Angular 9 // ngx-bootstrap/datepicker 和 bootstrap 4 // 如何获得相同的样式
- video - 在没有声音的视频中添加背景音乐时出现问题
- python - 在不使用主文件中的变量的情况下调用外部类