作业

仔细阅读示例: EnumTest.java,运行它,分析运行结果?

你能得到什么结论?你掌握了枚举类型的基本用法了吗?

运行该示例代码后,会得到以下输出:

false
false
true
SMALL
MEDIUM
LARGE

根据输出可以得出以下结论:

  1. s和t引用不同的对象,因此s==t的结果为false。
  2. 枚举类型不是原始数据类型,所以s.getClass().isPrimitive()的结果为false。
  3. 通过使用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用的补码

 

 

 

 

 

请运行以下代码(TestDouble.java

你看到了什么样的输出,意外吗?

0.05 + 0.01 = 0.060000000000000005

1.0 - 0.42 = 0.5800000000000001

4.015 * 100 = 401.49999999999994

123.3 / 100 = 1.2329999999999999

 

这是由于浮点数在计算机中的存储和表示方式引起的舍入误差。在计算机中,浮点数采用二进制表示,不能精确地表示某些小数,特别是无限循环小数。

因此,当进行浮点数计算时,可能会出现舍入误差。这是由于浮点数的精度限制和舍入规则造成的。因此,在对浮点数进行计算和比较时,应该注意到这些舍入误差可能会导致结果与预期不一致。

为了处理精确的十进制计算,Java提供了BigDecimal类,它可以精确表示和计算任意精度的十进制数值。

 

 

 

注意:在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题。(为什么会这样呢?)

n  这是因为双精度浮点数(double)在内部以二进制形式表示,并且不能精确地表示一些十进制小数。在将double值转换为BigDecimal时,可能会出现舍入误差或截断误差。这是因为双精度浮点数的位数限制和舍入规则,导致无法精确表示某些十进制小数。

n  例如,将0.1作为double值传递给BigDecimal构造函数时,编译器将其转换为双精度二进制浮点数表示形式,即近似值0.1000000000000000055511151231257827021181583404541015625。当该近似值用于创建BigDecimal时,可能会导致舍入误差。

n  为了避免这种问题,应该使用字符串来构建BigDecimal对象。使用字符串形式的构造函数可以确保精确地表示给定的十进制数值,避免了舍入误差。

 

 

以下代码的输出结果是什么?

                 int X=100;

                 int Y=200;

                 System.out.println("X+Y="+X+Y);

                 System.out.println(X+Y+"=X+Y");

  为什么会有这样的输出结果?

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”。

 

 

 

 

                        

posted @ 2023-09-13 20:55  菜鸟de博客  阅读(8)  评论(0)    收藏  举报