基本数据类型在Java中的实现

前言

  • 笔者在初学Java SE时,发现基本数据类型内涵玄机,于是动用拙笔粗略写下学习心得
  • 若文中有表述不严谨之处,还望各位指出!

前置知识

  • 各存储单位之间的关系:
    1. 1 byte(字节)=8 bit(比特)
    2. 1 KB = 1024 bytes
    3. 1 MB = 1024 KB
    4. 1 GB = 1024 MB
    5. 1 TB = 1024 GB
    6. 1 PB = 1024 TB
  • 计算机底层的所有数据都是采用补码形式存储的,而输出是原码形式
  • 对于数字形式的字面量,最高位用于符号位,0为正,1为负
  • 于正数而言,反码以及补码与原码形式相同,都以字面量的二进制形式存储
  • 于负数而言,
    1. 原码:十进制负数求绝对值,最高位修改为1
    2. 反码:在原码基础上符号位不变,其他位取反
    3. 补码:在反码基础上,符号位不变,加1
    • 补码推原码
      1. 取反再加1
      2. -1再取反

基本数据类型有哪些?

  • 整数类型有以下:
    1. byte,占据1个字节,即8个bit
    2. int,占据4个字节
    3. short,占据2个字节
    4. long,占据8个字节
  • 浮点数类型如下:
    1. float,占据4个字节
    2. double,占据8个字节
  • 布尔类型如下:
    1. boolean,占据1个字节
  • 字符类型如下:
    1. char,占据2个字节
  • String是引用数据类型,故在此不讨论

哪些数据类型需要特别关注?

  • byte的取值范围 -128~127
  • boolean只有truefalse两种表现形式
  • charshort都只占据一个字节,取值个数相同(65536个),但取值范围不同
    1. char虽然是字符型,但经过对应的字符编码后会转换为对应的二进制位,所以其底层也是二进制。其取值范围 0~65535
    2. short取值范围 -32768~32767
    3. 之所以会有如此差别,是因为字符型不是数字形式的字面量,无正负之分
  • floatdouble
    • 当需要存储现实世界的无限位数数据时,计算机只会存储近似值,不会全盘存储,不用双等号判断,利用比较符
    • 有两种表现形式
      1. 十进制,例如0.32
      2. 科学计数法,例如32E-2也是0.32
    • 浮点型数据的底层存储也和其他类型不同,以单精度(float)为例
      1. 符号位,1位
      2. 指数位,8位 (又称偏移量,最大偏移量位为127)
      3. 尾数位,23位 (小数部分的有效数字)
      4. 指数级增长,故而其存储容量大于占据8个字节的long
  • char参与的运算
    1. 不允许直接定义空字符型变量,而是'\u0000'(\u之后跟十六进制数字,是某个字符的编码)
    2. 在给字符型变量赋值时,若为整数型,则默认作为ASCII码值处理
    3. 做数学运算时,先转换为容量大的数据类型再做运算(多种数据类型做运算)
    4. 语法规则:当 byte,short,char做混合运算时,各自先转换为int类型再做运算
  • 数据类型的默认值
数据类型 默认值 说明
int/byte/short 0
long 0L
float 0.0F
double 0.0
char \u0000 空字符
boolean false

Java编译器的“小心思”

  • 多数据混合运算时,各自先转换为容量最大的类型再做运算
  • 当运算符两边都是字面量时,其运算会在编译阶段完成(优化),当运算符两旁是变量时,则在运行阶段运算(注意优先级)
  • 如果字面量没有超出需要被赋值的变量的取值范围,则无误

在Java中如何将对应进制转换为十进制?

    // 十进制(10)
    int a = 10;

    // 二进制(2)
    int b = 0b10;

    // 八进制(8)
    int c = 010;

    // 十六进制(16)
    int d = 0x10;

关于数据类型之间的转换

  • 首先声明整数型和浮点型
    • 整数型会默认为int,在字面量后加L/l则会认为long
    	int a = 10;
    	long b = 10L;
    	long c =10;// 编译可能报错(当字面量超出范围),类型不匹配
    
    • 浮点型会默认为double,在字面量后加F/f则会认为float(代码逻辑同上)
  • 强制类型转换
    1. 允许大容量转换为小容量,但不能自动转换,需要强制转换符
    2. 劣势:损失精度(当大容量变量存储小数据时,强转不一定损失精度)
    3. 原理:将高位二进制砍掉,剩下二进制组成补码;要看损失了多少,还得将补码转换为原码来看
  • 自动类型转换:允许小容量自动转换为大容量,若字面量与变量类型不匹配,会自动转换

常见转义字符

  • 注意:转义字符不是字符串,而是斜杠后的字符对应的特别行为!
//  \t  制表符 
//  \n  换行
//  \"  双引号
//  \'  单引号
//  \\  斜杠(字符串类型时,输出单斜杠时)
//  前后引号匹配时,优先最近的
posted @ 2026-08-09 17:04  飞猪上树  阅读(11)  评论(0)    收藏  举报