作业
n 仔细阅读示例: EnumTest.java,运行它,分析运行结果?
n 你能得到什么结论?你掌握了枚举类型的基本用法了吗?
运行该示例代码后,会得到以下输出:
false
false
true
SMALL
MEDIUM
LARGE
根据输出可以得出以下结论:
- s和t引用不同的对象,因此s==t的结果为false。
- 枚举类型不是原始数据类型,所以s.getClass().isPrimitive()的结果为false。
- 通过使用valueOf()方法可以将字符串转换为枚举类型。在此例中,s和u引用同一个对象,所以s==u的结果为true。
掌握了但基本
阅读相应教材,或者使用互联网搜索引擎,弄清楚反码、补码跟原码这几个概念,然后编写示例程序,对正数、负数进行各种位操作,观察输出结果,与手工计算的结果进行比对,看看Java中的数是采用上述哪种码表示的。
在Java中,整数类型(byte、short、int、long)采用补码表示。补码是一种用于表示负数的编码方式,它是计算机系统中最常用的表示方式。
反码是补码的一种特殊形式。对于正数而言,它的补码和反码都与原码相同。但对于负数而言,反码形式是将原码中的符号位不变,其余位按位取反得到的。
public class NumberRepresentation {
public static void main(String[] args) {
int positiveNumber = 10;
int negativeNumber = -10;
// 按位取反
System.out.println("~" + positiveNumber + ": " + (~positiveNumber));
System.out.println("~" + negativeNumber + ": " + (~negativeNumber));
// 左移
int shiftedLeftPositive = positiveNumber << 2;
int shiftedLeftNegative = negativeNumber << 2;
System.out.println(positiveNumber + " << 2: " + shiftedLeftPositive);
System.out.println(negativeNumber + " << 2: " + shiftedLeftNegative);
// 右移
int shiftedRightPositive = positiveNumber >> 2;
int shiftedRightNegative = negativeNumber >> 2;
System.out.println(positiveNumber + " >> 2: " + shiftedRightPositive);
System.out.println(negativeNumber + " >> 2: " + shiftedRightNegative);
// 无符号右移
int unsignedShiftedRightPositive = positiveNumber >>> 2;
int unsignedShiftedRightNegative = negativeNumber >>> 2;
System.out.println(positiveNumber + " >>> 2: " + unsignedShiftedRightPositive);
System.out.println(negativeNumber + " >>> 2: " + unsignedShiftedRightNegative);
// 位与
int bitwiseAndResult = positiveNumber & negativeNumber;
System.out.println(positiveNumber + " & " + negativeNumber + ": " + bitwiseAndResult);
// 位或
int bitwiseOrResult = positiveNumber | negativeNumber;
System.out.println(positiveNumber + " | " + negativeNumber + ": " + bitwiseOrResult);
// 位异或
int bitwiseXorResult = positiveNumber ^ negativeNumber;
System.out.println(positiveNumber + " ^ " + negativeNumber + ": " + bitwiseXorResult);
}
}
~10: -11
~-10: 9
10 << 2: 40
-10 << 2: -40
10 >> 2: 2
-10 >> 2: -3
10 >>> 2: 2
-10 >>> 2: 1073741821
10 & -10: 2
10 | -10: -2
10 ^ -10: -4
Java用的补码
n 请运行以下代码(TestDouble.java)
n 你看到了什么样的输出,意外吗?
0.05 + 0.01 = 0.060000000000000005
1.0 - 0.42 = 0.5800000000000001
4.015 * 100 = 401.49999999999994
123.3 / 100 = 1.2329999999999999
这是由于浮点数在计算机中的存储和表示方式引起的舍入误差。在计算机中,浮点数采用二进制表示,不能精确地表示某些小数,特别是无限循环小数。
因此,当进行浮点数计算时,可能会出现舍入误差。这是由于浮点数的精度限制和舍入规则造成的。因此,在对浮点数进行计算和比较时,应该注意到这些舍入误差可能会导致结果与预期不一致。
为了处理精确的十进制计算,Java提供了BigDecimal类,它可以精确表示和计算任意精度的十进制数值。
n 注意:在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题。(为什么会这样呢?)
n 这是因为双精度浮点数(double)在内部以二进制形式表示,并且不能精确地表示一些十进制小数。在将double值转换为BigDecimal时,可能会出现舍入误差或截断误差。这是因为双精度浮点数的位数限制和舍入规则,导致无法精确表示某些十进制小数。
n 例如,将0.1作为double值传递给BigDecimal构造函数时,编译器将其转换为双精度二进制浮点数表示形式,即近似值0.1000000000000000055511151231257827021181583404541015625。当该近似值用于创建BigDecimal时,可能会导致舍入误差。
n 为了避免这种问题,应该使用字符串来构建BigDecimal对象。使用字符串形式的构造函数可以确保精确地表示给定的十进制数值,避免了舍入误差。
n 以下代码的输出结果是什么?
int X=100;
int Y=200;
System.out.println("X+Y="+X+Y);
System.out.println(X+Y+"=X+Y");
n 为什么会有这样的输出结果?
n X+Y=100200
n 300=X+Y
n 这是由于Java中的字符串连接操作符(+)具有从左到右的结合性。在第一行代码中,首先连接字符串"X+Y=“和整数X的值(“X+Y=”+X),然后再连接整数Y的值。因此,输出结果为"X+Y=100200”。
n 而在第二行代码中,首先进行整数X和整数Y的加法运算(X+Y),得到结果300,然后连接字符串"=“和整数X+Y的值(”=“+(X+Y)),因此输出结果为"300=X+Y”。

浙公网安备 33010602011771号