问 Java表达式1/0和1.0/0.0的值是什么?
答 在计算机内部,整数的表示使用补码表示,当被除数为0时,执行该操作的处理器会产生除零异常,在Java语言层面,
将产生除零异常。
而浮点数的表示,我们以常用的X86/X64处理器为例,在处理器内部以IEEE754表示,该表示法最初由伯克利分校受
英特尔公司委托研发,现在已经成为一个事实上的计算机内部浮点数表示标准。
IEEE754标准采用科学指数计数法表示浮点数,在内存或者寄存器内部,浮点数的表示分为三部分,1位符号位,
8位指数位,23位小数部分的尾数位。
我们令S=f1(s), E=f2(e), M=f3(m), 则
浮点数的计算公式为float = (-1)S * (1.M) 2(E), 即-1的S次方,1.M和2的E次方的乘积.
对于e, 当e!=0且e!=255时,称为浮点数的规范表示,
S=s, E=e-127, M左侧隐含有1为1.m,
当e==0或者e==255时,称为浮点数的非规范表示,
e==0, 此时,S=s, E=1-127, M左侧没有隐含的1.表示非常接近0的实数,当M等于0时,依据符号位
+0.0, -0.0.
e==255,此时,S=s, E=e-127, 如果M为0, 则依据符号位表示+infinite,-infinite。如果M不为0,则表示
Not a number(NaN), 比如sqrt(-1).
对于浮点数0.0参与的运算,IEEE754有相关的规定,k/0.0等于infinite,
测试代码:
package myAlgoth;
public class myMain {
public myMain() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.printf("%d\n", 1/0);
System.out.printf("%f", 1.0/0.0);
}
}
结果:
1. Exception in thread "main" java.lang.ArithmeticException: / by zero
at myAlgoth.myMain.main(myMain.java:8)
2. Infinity