Java 基本数据类型

Java 基本数据类型

先睹为快

name size(byte) range
boolean ? true or false
byte 1 -128( -2^(7) ) ~ 127( 2 ^ (7) - 1 )
short 2 -32768( -2^(15) ) ~ 32767( 2 ^ (15) - 1 )
char 2 -32768( -2^(15) ) ~ 32767( 2 ^ (15) - 1 )
int 4 -2147483648( -2^(31) ) ~ 2147483647( 2 ^ (31) - 1 )
float 4 3 .4e–038 ~ 3.4e+038
long 8 -9223372036854775808( -2^(63) ) ~ 9223372036854775807( 2 ^ (63) - 1 )
double 8 1 .7e–308 ~ 1.7e+308

整数量

整数字面量默认为int类型,证明

Object object = 12;
System.out.println(object.getClass());// output: class java.lang.Integer

在Java中,整数字面量有十进制,二进制(0B or 0b开头)八进制(0开头)以及十六进制(0X or 0x 开头)表示方式。具体表示为

Truth-Value Binary Octal Decimal Hexadecimal
24 0B00011000 030 24 0x18

此外,计算机以补码的方式存储者所有的整数,最高位为符号位(这就是为啥int的Max值为0后面31个1的原因了)。补码的计算规则为:

  • 正数的补码和原码完全相同
  • 负数的补码是其绝对值的原码、取反加一,反码就是原码按位取反。
    例如int a = -24;
    那么a的二进制形式为11111111111111111111111111101000。
    绝对值原码:24的二进制形式为00000000000000000000000000011000。
    取反:取反后的二进制形式为11111111111111111111111111100111
    加一:再加1的结果为11111111111111111111111111101000,这就是-24的补码了。
    如果是补码反过来求其绝对值的原码,那么就是先减一,在取反。


注意:

  • 如果直接讲一个较小的整数(范围在short和byte之中的)赋值给short,byte,那么自动转化为short,byte类型。无需强制类型转换;
  • 如果是一个大整数(范围超过int)字面量赋值给long时,需要在此字面量后缀加入‘L’或者‘l’显示指明此字面量为long而非int,否则编译不通过

浮点型

浮点型字面量默认为double类型,证明

Object object = 12.12;
System.out.println(object.getClass()); // output: class java.lang.Double

Java 采用的是IEEE 754标准存储浮点数。在内存单元中存储一个浮点数会划分为三个不同的部分:符号位(Sign)、阶码(Exponent)、尾数(Fraction);float和double的结构对比

Type Sign Exponent Fraction TotalSize(Bit) Offset Range of Exponent Range
float 1 8 23 32 127 1 ~ 254 3 .4e–038 ~ 3.4e+038
double 1 11 52 64 1023 1 ~ 2046 1 .7e–308 ~ 1.7e+308

Sign为0表示为正,1表示为负。

Exponent表示尾数所乘以的2的次方数,决定了数据显示的范围

Fraction默认开始为1,这样可以省出一位的存储空间,也就是说无论尾数是什么,其都表示为 1.### * (2 ^ #)。该字段利用移码方式存储,也就是真值+偏移量的和作为存储。决定了数据的精度

例如,十进制数据178.125的二进制浮点表示方法为1.0110010001 * ( 2 ^ 111 ),Exponent实际存储的值为00000111+01111111 = 10000110,故其float表示为

Sign Exponent Fraction
0 10000110 01100100010000000000000


注意:

  • 如果将浮点型字面量赋值给float时,需要加上‘F’或者‘f’的后缀显示指明字面量类型,否则编译不通过。
  • 可以通过在浮点型字面量后加‘D’或者‘d’来显示指明此浮点型的类型为double
  • 如果开发过程中需要精确保存一个浮点数,那么可以考虑BigDecimal
  • 科学计数法(如1.23e10)仅仅用于表示浮点型,整型不可用科学计数法表示
  • 正无穷大常量为POSITIVE_INFINITY;负无穷大为NEGATIVE_INFINITY;非数值类型通过常量NaN表示。

字符型

Java使用16位的Unicode字符集作为编码方式,而Unicode被设计成支持世界上所有的书面字符。可以直接利用Unicode值来表示字符型值,格式为’\uXXXX’。XXXX是4个十六进制位。

布尔型

仅能用true和false表示,其他基本类型和boolean之间无法转换。Java规范并没有强制指定boolean所占的内存空间。但是由于JVM采用32位的stack cell来存储各样的变量,少于32位的,会被padded out(填充),多于32位的会使用2个cell来存储如long和double。因此boolean的存储实际上应该占用了32位,但是仅有1位有效的存储了布尔值。请再次注意,Java Documentation并未对boolean的位长做出详细的规定。

The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its “size” isn’t something that’s precisely defined. —— The Java™ Tutorials

你可能感兴趣的:(java)