Java 中的原始数据类型

Java 中的原始数据类型

原文: https://howtodoinjava.com/java/basics/primitive-data-types-in-java/

了解 Java 中所有八种基本数据类型,它们的内存大小,默认值以及最大值和最小值范围。

原始数据类型由语言预先定义,并由保留关键字命名。 让我们在下面的图片中查看每种原始数据类型。

Primitive data types in java

Java 中的原始数据类型

1. 整数数据类型

整数数据类型是数值数据类型,其值为整数。 Java 提供五个整数数据类型byteshortintlongchar

1.1 int数据类型

  • int数据类型是 32 位带符号的 Java 基本数据类型。 int数据类型的变量占用 32 位内存
  • 其有效范围是-2,147,483,6482,147,483,647-2 ^ 31 2 ^ 31 – 1)。
  • 此范围内的所有整数都称为整数字面值(或整数常量)。 例如,10,-200、0、30、19 等是int的整数字面值。

可以将整数字面值分配给int变量,例如counter,如下所示:

int counter = 21;

1.1.1 Integer包装器类

Java 有一个名为Integer的包装器类,该包装器类定义了两个常量来表示int数据类型Integer.MAX_VALUEInteger.MIN_VALUE的最大值和最小值。 它是 int 值的对象表示。

int max = Integer.MAX_VALUE; // Assigns maximum int value to max
int min = Integer.MIN_VALUE; // Assigns minimum int value to min

1.2 long数据类型

  • long数据类型是 64 位带符号的 Java 基本数据类型。
  • 当对整数的计算结果可能超出int数据类型的范围时,将使用它。
  • 其范围是-2 ^ 632 ** 63 – 1
  • long范围内的所有整数都称为 long 类型的整数字面值

long 类型的整数字面值始终以L(或小写的l)结尾。

long num1 = 0L;
long num2 = 401L;
long mum3 = -3556L;

1.2.1 类型转换

即使long变量中存储的值恰好在int数据类型的范围内,也不允许从longint的赋值,而无需显式类型转换, 如下例所示:

int num1 = 5;
long num2 = 25L;

// A compile-time error. Even if num2's value 25 which is within the range of int.
num1 = num2;

如果要将long变量的值分配给int变量,则必须在代码中明确提及这一事实,以便 Java 确保您知道可能存在数据溢出。 您可以使用 Java 中的“类型转换”来执行此操作,如下所示:

long num1 = (int) num2; // Now it is fine because of the "(int)" cast

通过编写(int)num2,您将指示 Java 将num2中存储的值视为int。 在运行时,Java 将仅使用num2的 32 个最低有效位,并将存储在这 32 位中的值分配给num1。 如果num2的值超出 int 数据类型的范围,则num1中不会获得相同的值,并且会导致数据丢失

1.2.2 long包装类

Java 具有类Long(请注意Long中的大写L),该类定义了两个常量来表示长数据类型的最大值和最小值Long.MAX_VALUELong.MIN_VALUE

long max = Long.MAX_VALUE;
long min = Long.MIN_VALUE;

1.3 byte数据类型

  • byte数据类型是 8 位带符号的 Java 基本整数数据类型。
  • 其范围是 -128 至 127(-2 ^ 72 ^ 7 – 1)。 这是 Java 中可用的最小整数数据类型
  • intlong字面值不同,没有字节字面值。
  • 但是,您可以将属于byte范围的任何int字面值分配给byte变量。
byte b1 = 125;
byte b2 = -11;

1.3.1 类型转换

如果将int字面值分配给byte变量,并且该值超出字节数据类型的范围,则 Java 会生成编译器错误。 以下代码段将产生编译器错误:

// An error. 150 is an int literal outside -128 to 127
byte b3 = 150;

Java 不允许您将范围较大的数据类型的变量的值分配给范围较小的数据类型的变量,因为在进行这种分配时可能会失去精度。 要进行从intbyte的赋值,必须像在longint赋值时那样使用强制转换。

b1 = (byte)num1; // Ok

1.3.2 Byte包装器类

Java 具有类Byte(请注意,字节中的大写B),该类定义了两个常量来表示字节数据类型的最大值和最小值Byte.MAX_VALUEByte.MIN_VALUE

byte max = Byte.MAX_VALUE;
byte min = Byte.MIN_VALUE;

1.4 short数据类型

  • short数据类型是 16 位带符号的 Java 基本整数数据类型。 其范围是 -32768 至 32767(或-2 ^ 152 ^ 15 – 1)。与intlong字面值不同,没有short字面值。但是,您可以将任何在short范围内的int字面值(-32768 到 32767)分配给short变量。
short s1 = 12905;   // ok
short s2 = -11890;  // ok

字节变量的值始终可以分配给short变量,因为byte数据类型的范围在short数据类型的范围内。 将值从intlong变量分配给short变量的所有其他规则与字节变量的规则相同。

1.4.1 Short包装类

Java 有一个名为Short的类(在Short中注意大写字母S),它定义了两个常量来表示short数据类型的最大值和最小值Short.MAX_VALUEShort.MIN_VALUE

short max = Short.MAX_VALUE;
short min = Short.MIN_VALUE;

1.5 char数据类型

  • char数据类型是 16 位无符号 Java 基本数据类型。
  • 它表示 Unicode 字符
  • 请注意,char是无符号数据类型。 因此,char变量不能具有负值。
  • char数据类型的范围是 0 到 65535,与 Unicode 集的范围相同。
  • 字符字面值表示char数据类型的值。
char c1 = 'A';
char c2 = 'L';
char c3 = '5';
char c4 = '/';

1.5.1 字符转义序列

字符字面值也可以表示为字符转义序列。 字符转义序列以反斜杠开头,后跟一个字符,并且两者都用单引号引起来。

共有八个预定义的字符转义序列,如下所示:

字符转义序列 描述
\n 换行
\r 回车
\f 换页
\b 退格键
\t 标签
\\ 反斜杠
\" 双引号
\' 单引号

这些只是 Java 中的八个字符转义序列。 您不能定义自己的字符转义序列。

1.5.2 Unicode 转义序列

字符字面值也可以表示为'\uxxxx'形式的 Unicode 转义序列,此处\u(反斜杠紧跟小写的u)表示 Unicode 转义序列的开始,并且xxxx恰好代表四个十六进制数字。

char c1 = 'A';
char c2 = '\u0041';  // Same as c2 = 'A'

2. 浮点数据类型

包含小数部分的浮点数被称为实数,例如 3.25、0.49,-9.19 等。

数字如何存储在内存中

将实数转换为二进制表示形式时,计算机还必须存储数字中小数点的位置。 有两种策略可以将实数存储在计算机内存中。

  1. 定点数字格式 – 仅存储数字的二进制表示,并假定在该点之前和之后始终有固定数量的数字。 一个点在数字的十进制表示形式中称为小数点,在二进制表示形式中称为二进制点。 点的位置始终固定在数字中的表示类型称为“定点”数字格式。
  2. 浮点数格式 – 存储实数的二进制表示形式以及该点在实数中的位置。 由于在这种实数表示中,点之前和之后的位数可能会有所不同,因此我们说该点可以浮动。 这种表示形式称为“浮点”格式。

与定点表示相比,浮点表示的速度较慢,准确度较低。 但是,与定点表示相比,浮点表示可以在相同的计算机内存中处理更大范围的数字。

Java 支持“浮点”数字格式。

Floating-Point Numbers

IEEE-754 32 位单精度浮点数

Java 有两种浮点数字数据类型:floatdouble

2.1 float数据类型

float数据类型以 32 位 IEEE 754 标准格式存储浮点数(单精度浮点数)。 它的实数大小可小至1.4 x 10 ^ -45,大至3.4 x 10 ^ 38。 该范围仅包括幅度。 它可以是正面的或负面的。

所有以fF结尾的实数都称为浮点字面值

float f1 = 8F;
float f2 = 8.F;
float f3 = 8.0F;

2.1.1 正负无穷大

float数据类型定义两个无限性:正无穷大和负无穷大。 例如,将2.5F除以0.0F的结果是浮点正无穷大,而2.5F除以-0.0F的结果是浮点负无穷大。

2.1.2 NaN(非数字)

未对float上的某些操作结果进行定义。 这些结果由称为NaN(非数字)的float数据类型的特殊值表示。

Float类定义了三个常量,分别表示float数据类型的正无穷大,负无穷大和NaN。 还有两个常量,它们代表可以存储在float变量中的最大值和最小值(大于零)。

Float.POSITIVE_INFINITY - Positive infinity of type float.
Float.NEGATIVE_INFINITY - Negative infinity of type float.
Float.NaN - Not a Number of type float.
Float.MAX_VALUE - The largest positive value that can be represented in a float variable.
Float.MIN_VALUE - The smallest positive value greater than zero that can be represented in a float variable. 

请注意,可以将所有整数类型(intlongbyteshortchar)的值分配给float数据类型的变量,而无需使用显式强制转换,但必须先对float值进行强制转换,然后再将其赋给任何整数数据类型intlongbyteshortchar的变量。

2.2 double数据类型

double数据类型以 64 位“IEEE 754 标准格式”存储浮点数。 根据 IEEE 754 标准,以 64 位表示的浮点数也称为双精度浮点数

所有实数都称为double字面量。 双精度字面值可以选择以dD结尾,例如19.27d。 但是,后缀dD在双字面量中是可选的。 也就是说,19.27d19.27D都代表相同的双字面量。

double d1 = 8D
double d2 = 8.;
double d3 = 8.0;
double d4 = 8.D;

float数据类型一样,double数据类型定义了最大值,最小值,两个无限和一个NaN值。

Double.POSITIVE_INFINITY - Positive infinity of type double.
Double.NEGATIVE_INFINITY - Negative infinity of type double.
Double.NaN - Not a Number of type double.
Double.MAX_VALUE - The largest positive value that can be represented in a double variable.
Double.MIN_VALUE - The smallest positive value greater than zero that can be represented in a double variable. 

3. 布尔值

3.1 布尔数据类型

布尔数据类型只有两个有效值:truefalse。 这两个值称为布尔字面值。 您可以将布尔字面值用作

boolean done; // Declares a boolean variable named done
done = true;  // Assigns true to done

需要注意的重要一点是布尔变量不能转换为任何其他数据类型,反之亦然。 Java 没有指定布尔数据类型的大小。 它的大小由 JVM 实现决定。 通常,布尔数据类型的值在内部以字节存储。

这就是 Java 中可用的 8 种原始数据类型的全部内容。

学习愉快!

阅读更多:

Oracle Java 文档

数据表示