如何在 Java 中检查整数是否在字节范围内

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何检查一个整数值是否在 Java 的 byte 数据类型范围内。我们将首先了解 byte 类型的定义范围,即从 -128 到 127。

接下来,你将学习如何将一个整数与这些 byte 类型的边界值进行比较,以确定它是否在有效范围内。最后,我们将使用边界情况对逻辑进行测试,以确保其正确性。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java/BasicSyntaxGroup -.-> java/data_types("Data Types") java/BasicSyntaxGroup -.-> java/type_casting("Type Casting") subgraph Lab Skills java/data_types -.-> lab-560006{{"如何在 Java 中检查整数是否在字节范围内"}} java/type_casting -.-> lab-560006{{"如何在 Java 中检查整数是否在字节范围内"}} end

定义字节范围(-128 到 127)

在这一步中,我们将探索 Java 中的 byte 数据类型,并了解其取值范围。byte 数据类型是 Java 中的基本数据类型之一,用于存储小整数值。

一个 byte 变量可以存储从 -128 到 127(包括 -128 和 127)的整数值。这是因为一个字节使用 8 位内存,而 8 位可以表示 2^8 = 256 个不同的值。这些值被分为负数、正数和零。

让我们创建一个简单的 Java 程序来演示 byte 数据类型。

  1. 如果 HelloJava.java 文件尚未在 WebIDE 编辑器中打开,请打开它。

  2. 将文件的全部内容替换为以下代码:

    public class HelloJava {
        public static void main(String[] args) {
            byte minByteValue = -128;
            byte maxByteValue = 127;
    
            System.out.println("Minimum byte value: " + minByteValue);
            System.out.println("Maximum byte value: " + maxByteValue);
        }
    }

    在这段代码中:

    • 我们声明了一个 byte 变量 minByteValue,并将其赋值为 byte 类型的最小值 -128。
    • 我们声明了另一个 byte 变量 maxByteValue,并将其赋值为 byte 类型的最大值 127。
    • 然后,我们使用 System.out.println 将这些值打印到控制台。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 现在,让我们编译我们的程序。打开 WebIDE 底部的终端,并确保你位于 ~/project 目录中。然后,运行以下命令:

    javac HelloJava.java

    如果编译成功,你将看不到任何输出。

  5. 最后,使用 java 命令运行编译后的程序:

    java HelloJava

    你应该会看到以下输出,显示 byte 类型可以存储的最小值和最大值:

    Minimum byte value: -128
    Maximum byte value: 127

这个程序演示了 Java 中 byte 数据类型的定义范围。在为变量选择合适的数据类型时,了解这些限制非常重要,以避免像溢出这样的潜在问题。

将整数与字节范围进行比较

在上一步中,我们了解了 byte 数据类型的取值范围(-128 到 127)。现在,让我们看看当尝试将超出这个范围的整数值赋给 byte 变量时会发生什么。

Java 还有其他整数数据类型,如 int,它可以存储更大的值。当你试图将一个较大的值放入一个较小的容器中(例如将 int 值放入 byte 中),可能会遇到问题。

  1. 在 WebIDE 编辑器中打开 HelloJava.java 文件。

  2. 修改 main 方法,使其包含一个超出字节范围的整数值。将 main 方法内的现有代码替换为以下内容:

    public static void main(String[] args) {
        int largeIntValue = 200; // This value is outside the byte range
    
        // Trying to assign a large int value to a byte variable
        // byte myByte = largeIntValue; // This line will cause a compilation error
    
        System.out.println("Integer value: " + largeIntValue);
    
        // To assign a larger integer to a byte, you need a cast
        byte castedByte = (byte) largeIntValue;
        System.out.println("Casted byte value: " + castedByte);
    }

    让我们看看这些更改:

    • 我们声明了一个 int 变量 largeIntValue,并将其赋值为 200,这个值大于 byte 所能容纳的最大值(127)。
    • 注释掉的代码行 byte myByte = largeIntValue; 展示了如果直接尝试将 largeIntValue 赋给 byte 会发生什么。这会导致一个 编译错误,因为 Java 会阻止你在没有明确告知的情况下可能丢失数据。
    • 代码行 byte castedByte = (byte) largeIntValue; 展示了如何使用 类型转换 来强制进行赋值。largeIntValue 前面的 (byte) 告诉 Java 将 int 值转换为 byte
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 现在,在终端中尝试编译修改后的程序:

    javac HelloJava.java

    这次,编译应该会成功,因为我们使用了类型转换。

  5. 运行编译后的程序:

    java HelloJava

    你将看到以下输出:

    Integer value: 200
    Casted byte value: -56

注意,castedByte 的值是 -56,而不是 200。这是因为当你将一个超出目标类型范围的值进行类型转换时,该值会“回绕”。这被称为 溢出(对于负数则是 下溢)。值 200 以二进制形式表示,当它被截断以适应 8 位(一个字节)时,结果就是 -56。

这一步强调了理解数据类型范围以及在不同类型之间进行转换时谨慎使用类型转换的重要性,以避免因溢出或下溢而导致意外结果。

进行边界情况测试

在前面的步骤中,我们了解了 byte 数据类型的取值范围,以及使用类型转换尝试赋值超出该范围的值时会发生什么。现在,让我们专门测试边界情况,即 byte 取值范围的最小值和最大值(-128 和 127),以及刚好超出这个范围的值。

测试边界情况是编程中的常见做法,以确保你的代码在预期值的边界处能正常运行。

  1. 在 WebIDE 编辑器中打开 HelloJava.java 文件。

  2. 修改 main 方法,以测试接近字节范围边界的值。将 main 方法内的现有代码替换为以下内容:

    public class HelloJava {
        public static void main(String[] args) {
            // Values within the byte range
            byte valueWithinRange1 = 0;
            byte valueWithinRange2 = 100;
            byte valueWithinRange3 = -50;
    
            System.out.println("Value within range 1: " + valueWithinRange1);
            System.out.println("Value within range 2: " + valueWithinRange2);
            System.out.println("Value within range 3: " + valueWithinRange3);
    
            // Edge cases
            byte minByte = -128;
            byte maxByte = 127;
    
            System.out.println("Minimum byte value: " + minByte);
            System.out.println("Maximum byte value: " + maxByte);
    
            // Values just outside the byte range (require casting)
            int valueJustBelowMin = -129;
            int valueJustAboveMax = 128;
    
            byte castedBelowMin = (byte) valueJustBelowMin;
            byte castedAboveMax = (byte) valueJustAboveMax;
    
            System.out.println("Value just below min (-129) casted to byte: " + castedBelowMin);
            System.out.println("Value just above max (128) casted to byte: " + castedAboveMax);
        }
    }

    在这段代码中,我们测试了:

    • 完全在字节范围内的值。
    • 字节范围的确切最小值和最大值。
    • 刚好超出最小值和最大值范围的值,使用类型转换来观察溢出/下溢的效果。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 在终端中编译程序:

    javac HelloJava.java

    编译应该会成功。

  5. 运行编译后的程序:

    java HelloJava

    你应该会看到类似以下的输出:

    Value within range 1: 0
    Value within range 2: 100
    Value within range 3: -50
    Minimum byte value: -128
    Maximum byte value: 127
    Value just below min (-129) casted to byte: 127
    Value just above max (128) casted to byte: -128

观察超出范围的值的输出:

  • 将 -129 转换为字节类型的结果是 127。这是因为 -129 比最小值(-128)小 1,由于回绕效应,它变成了最大值(127)。
  • 将 128 转换为字节类型的结果是 -128。这是因为 128 比最大值(127)大 1,它回绕到了最小值(-128)。

这展示了在将超出固定大小数据类型(如 byte)范围的值进行类型转换时,整数溢出/下溢的循环特性。

总结

在本次实验中,我们首先了解了 Java 中 byte 数据类型的基本概念,特别是其定义的取值范围为 -128 到 127。我们知道这个范围是由用于表示一个字节的 8 位决定的,这使得它可以有 256 个不同的值。通过一个实际的 Java 程序,我们展示了如何声明并打印 byte 变量所能容纳的最小值和最大值,从而验证了这个定义的范围。这第一步为后续将整数与这些字节范围进行比较以及进行边界情况测试奠定了坚实的基础。