3. 基本数据类型与变量运算

基本数据类型与变量运算 学习卡片

基本数据类型与变量运算

Java 的八种基本数据类型分为四类:整数型(byte、short、int、long)、浮点型(float、double)、字符型(char)和布尔型(boolean)。每种类型有固定的位数和取值范围,声明变量时必须先指定类型,再进行赋值和运算。

类型位数取值范围默认值
byte8-128 ~ 1270
short16-32768 ~ 327670
int32-2³¹ ~ 2³¹-10
long64-2⁶³ ~ 2⁶³-10L
float32约 ±3.4×10³⁸(7位有效数字)0.0f
double64约 ±1.8×10³⁰⁸(15位有效数字)0.0d
char160 ~ 65535(Unicode)'\u0000'
boolean1true / falsefalse
基本数据类型运算与转换关系 byte (8位) short (16位) int (32位) long (64位) 自动提升 自动提升 自动提升 float (32位) double (64位) 自动提升 int→float 可能丢精度 强制类型转换 (窄化) 语法: (目标类型) 变量 double → int long → int int → byte / short float → int ⚠ 可能溢出或丢失小数部分 ⚠ 超出范围时按补码截断 整数溢出示例 byte b = 127; b = (byte)(b + 1); 结果: b = -128 127+1 超出 byte 范围 回绕到最小值 精度丢失示例 int a = 10, b = 3; int r1 = a / b; r1 = 3 (小数被截断) double r2 = (double)a / b; r2 = 3.3333... 运算规则要点: 1. 二元运算中,低精度类型自动提升为高精度类型(byte→short→int→long→float→double) 2. byte、short、char 参与运算时先提升为 int,结果也是 int 3. 强制转换可能丢失高位数据或小数精度,需确认目标类型能容纳结果

完整示例程序

下面的程序声明各类基本类型变量,演示自动类型提升、强制类型转换、整数溢出和浮点精度丢失,并输出每一步结果。

public class DataTypeDemo {
    public static void main(String[] args) {
        // 1. 声明各种基本类型变量
        byte   b  = 100;
        short  s  = 30000;
        int    i  = 2000000000;
        long   l  = 9000000000000000000L;
        float  f  = 3.14f;
        double d  = 3.141592653589793;
        char   c  = 'A';
        boolean flag = true;

        System.out.println("byte:    " + b);
        System.out.println("short:   " + s);
        System.out.println("int:     " + i);
        System.out.println("long:    " + l);
        System.out.println("float:   " + f);
        System.out.println("double:  " + d);
        System.out.println("char:    " + c + " (ASCII: " + (int) c + ")");
        System.out.println("boolean: " + flag);

        // 2. 自动类型提升:int + long → long
        long sum = i + l;
        System.out.println("\n自动提升 int+long = " + sum);

        // 3. 整数除法精度丢失
        int a = 10, b2 = 3;
        int intResult = a / b2;
        double doubleResult = (double) a / b2;
        System.out.println("整数除法 10/3 = " + intResult);
        System.out.println("浮点除法 10/3 = " + doubleResult);

        // 4. 强制类型转换:double → int 截断小数
        double pi = 3.99;
        int piInt = (int) pi;
        System.out.println("(int)3.99 = " + piInt);

        // 5. 整数溢出演示
        byte maxByte = 127;
        byte overflow = (byte) (maxByte + 1);
        System.out.println("\nbyte 127 + 1 = " + overflow);

        int maxInt = Integer.MAX_VALUE;
        int intOverflow = maxInt + 1;
        System.out.println("int MAX + 1 = " + intOverflow);

        // 6. 浮点精度问题
        double d1 = 0.1 + 0.2;
        System.out.println("\n0.1 + 0.2 = " + d1);
        System.out.println("是否等于 0.3: " + (d1 == 0.3));
    }
}

运行结果与判读

byte:    100
short:   30000
int:     2000000000
long:    9000000000000000000
float:   3.14
double:  3.141592653589793
char:    A (ASCII: 65)
boolean: true

自动提升 int+long = 9000000002000000000
整数除法 10/3 = 3
浮点除法 10/3 = 3.3333333333333335
(int)3.99 = 3

byte 127 + 1 = -128
int MAX + 1 = -2147483648

0.1 + 0.2 = 0.30000000000000004
是否等于 0.3: false
关键判读:
  • byte 127 + 1 = -128:byte 最大值加 1 后回绕到最小值,这是补码表示下的溢出行为。
  • int MAX + 1 = -2147483648:int 溢出后变为最小值,不会抛出异常,需自行检查。
  • 0.1 + 0.2 != 0.3:double 无法精确表示 0.1 和 0.2,累加后产生微小误差,比较浮点数应使用容差范围。
  • (int)3.99 = 3:强制转换直接截断小数部分,不进行四舍五入。
实践建议:涉及金额计算时使用 BigDecimal 而非 double;大整数运算使用 long 或 BigInteger;比较浮点数时用 Math.abs(a - b) < 1e-6 代替 ==。