TIPS

数据类型

类型 字节数 范围 举例
byte 1 $-128\sim 127$ ($-2^7\sim 2^7 - 1$) 123
short 2 $-2^{15}\sim 2^{15} - 1$ 12345
int 4 $-2^{31}\sim 2^{31} - 1$ 12345678
long 8 $-2^{63}\sim 2^{63} - 1$ 1234567890123L
float(高精度) 4 $-2^{31}\sim 2^{31} - 1$ 1.2F
double(高精度) 8 $-2^{63}\sim 2^{63} - 1$ 1.3, 1.3D
boolean 1 true/false
char 2 ‘A’

为什么byte的范围为$-2^7\sim 2^7 - 1$?

Java中所有整数类型都是使用补码来表示有符号整数

1 byte = 8 bit
8 bit的表示方法:0000 0000,每一位只有0 1,也就是二进制

在字节数范围表示中规定:

  • 第一位如果是0:表示正数
  • 第一位如果是1:表示负数

最小值:1000 0000 表示-128
最大值:0111 1111 表示127

十进制 原码(二进制) 反码 补码
+5 0000 0101 - 0000 0101
-5 1000 0101(原码) 1111 1010(反码) 1111 1011(补码)
-1 1000 0001(原码) 1111 1110(反码) 1111 1111(补码)
-128 1000 0000(特殊情况)
  1. 原码
    定义: 原码是最简单的表示形式,符号位为 0 表示正数,为 1 表示负数,数值部分为该数的绝对值的二进制表示。
    示例:
  • +7 的原码为 00000111
  • -7 的原码为 10000111
  1. 反码
    定义:
    对于正数,反码与原码相同。
    对于负数,反码符号位不变,其余位按位取反。
    示例:
  • +7 的反码为 00000111
  • -7 的反码为 11111000
  1. 补码
    定义:
    对于正数,补码与原码相同。
    对于负数,补码是在反码的基础上加 1。
    示例:
  • +7 的补码为 00000111
  • -7 的补码为 11111001

总结

表示形式 符号位 数值位
原码 0 表示正数,1 表示负数 绝对值的二进制表示
反码 0 表示正数,1 表示负数 正数与原码相同,负数按位取反
补码 0 表示正数,1 表示负数 正数与原码相同,负数在反码基础上加 1

补码的作用用于给计算机识别做加法
如,计算$7 - 3$
$7$的原码:0000 0111
$-3$的原码:1000 0011

$7$的反码:0000 0111
$-3$的反码:1111 1100

$7$的补码:0000 0111
$-3$的补码:1111 1110

0000 0111

1111 1110
等于
0000 0101

不是1 0000 0101的原因是,最高位的进位会被丢弃,称为溢出

可以使用如下方法调用可变个数形参

1
2
3
4
5
6
7
8
public void func(int ... argc) {};
public void func(String ... argc) {};
...

// 类似于
public void func(int[] argc) {};
public void func(String[] argc) {};