问题

能否将 int 强制转换为 byte?若超出 byte 范围会怎样?

答案

核心结论

可以将 int 强制转换为 byte,但当 int 值超出 byte 的范围(-128 到 127)时,会发生截断,只保留低 8 位,高位直接丢弃。

原理说明

  1. 数据类型范围
    • int:32 位,范围 -2³¹ 到 2³¹-1
    • byte:8 位,范围 -128 到 127
  2. 强制转换机制
    • 语法:byte b = (byte) intValue;
    • 转换规则:保留 int 值的低 8 位,高 24 位直接丢弃
    • 结果:如果原值在 byte 范围内,值不变;超出范围则发生溢出
  3. 溢出计算方式
    • 实际值 = (原值 % 256 + 256) % 256,然后映射到 -128~127
    • 或者理解为:对 256 取模后,大于 127 的减去 256

代码示例

public class IntToByteDemo {
    public static void main(String[] args) {
        // 正常范围内的转换
        int a = 100;
        byte b1 = (byte) a;
        System.out.println("100 转为 byte: " + b1);  // 输出: 100

        // 超出范围的转换
        int c = 128;
        byte b2 = (byte) c;
        System.out.println("128 转为 byte: " + b2);  // 输出: -128

        int d = 129;
        byte b3 = (byte) d;
        System.out.println("129 转为 byte: " + b3);  // 输出: -127

        int e = 256;
        byte b4 = (byte) e;
        System.out.println("256 转为 byte: " + b4);  // 输出: 0

        int f = 300;
        byte b5 = (byte) f;
        System.out.println("300 转为 byte: " + b5);  // 输出: 44

        // 负数转换
        int g = -129;
        byte b6 = (byte) g;
        System.out.println("-129 转为 byte: " + b6); // 输出: 127
    }
}

二进制层面理解

以 300 转换为 byte 为例:

300 的二进制表示32):
00000000 00000000 00000001 00101100

强制转换为 byte 只保留低 8 
00101100  十进制 44

以 128 转换为 byte 为例:

128 的二进制表示 8 ):
10000000

byte 是有符号类型最高位是符号位
10000000  表示 -128补码表示

面试要点总结

  1. 可以强制转换,但需要显式使用 (byte) 进行类型转换
  2. 超出范围会截断,只保留低 8 位,不会抛出异常
  3. 溢出规律:可以通过二进制补码理解,或记住”对 256 取模”的规律
  4. 实际开发建议:转换前应先判断范围,避免意外的数据丢失
// 安全的转换方式
int value = 300;
if (value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE) {
    byte b = (byte) value;
} else {
    // 处理超出范围的情况
    System.out.println("值超出 byte 范围");
}

这道题考察的是对 Java 基本数据类型转换规则和二进制表示的理解,是 Java 基础中的重要知识点。