你好!随着您在 CodeGym 中的进步,您已经多次遇到原始类型。以下是我们对它们的了解的简短列表:
但除了具有不同的值外,它们在内存中占用的空间也不同。一个int占用的不仅仅是一个字节。多头比空头大。原始人占用的内存量可以与俄罗斯套娃进行比较: 每个套娃内部都有可用空间。嵌套娃娃越大,空间就越大。一个大的嵌套娃娃(长)很容易容纳一个较小的int。它很容易安装,你不需要做任何其他事情。在 Java 中,当使用原语时,这称为隐式转换。或者换句话说,它被称为拓宽。
我们把这个值写入一个short变量,它只能存储16位!因此,只有我们数字的前 16 位会被移到那里。其余的将被丢弃。结果,short 变量接收到以下值
十进制形式等于 -27008 这就是编译器要求您通过指示对特定类型的显式缩小转换来“确认”的原因。首先,这表明你对结果负责。其次,它告诉编译器在转换发生时要分配多少空间。毕竟,在最后一个示例中,如果我们将 int 值分配给 byte 变量而不是 short ,那么我们只能使用 8 位,而不是 16 位,结果会有所不同。分数类型(float和double)有自己的缩小转换的过程。如果您尝试将小数转换为整数类型,小数部分将被丢弃。
0 到 65536 的范围表示为char类型。但是,这是什么意思?毕竟,char不仅代表数字,还代表字母、标点符号……关键是在 Java 中,char值以 Unicode 格式存储。我们已经在之前的课程中遇到过 Unicode。您可能记得 Unicode 是一种字符编码标准,它包括世界上几乎所有书面语言的符号。换句话说,它是一个特殊代码列表,几乎可以代表任何语言中的每个字符。整个 Unicode 表非常大,当然没必要死记硬背。这是其中的一小部分: 最主要的是理解字符是如何存储的,并记住如果你知道特定字符的代码,你总是可以在你的程序中产生那个字符。让我们尝试一些随机数:
- 它们不是对象,代表存储在内存中的值
- 有几种
- 整数:byte、short、int、long
- 浮点(小数)数:float和double
- 逻辑值:布尔
- 符号值(用于表示字母和数字):char
-
每种类型都有自己的取值范围:
原始类型 | 内存大小 | 取值范围 |
---|---|---|
字节 | 8位 | -128 到 127 |
短的 | 16位 | -32768 至 32767 |
字符 | 16位 | 0 到 65536 |
整数 | 32位 | -2147483648 至 2147483647 |
长的 | 64位 | -9223372036854775808 至 9223372036854775807 |
漂浮 | 32位 | (2 的 -149 次方) 到 ((2 - (2 的 -23 次方)) * 2 的 127 次方) |
双倍的 | 64位 | (-2 的 63 次方) 到 ((2 的 63 次方) - 1) |
布尔值 | 8(在数组中使用时),32(如果不在数组中使用) | 对或错 |
在 Java 中加宽
这是一个扩大转换的简单示例:
public class Main {
public static void main(String[] args) {
int bigNumber = 10000000;
byte littleNumber = 16;
bigNumber = littleNumber;
System.out.println(bigNumber);
}
}
这里我们将一个 byte 值赋给一个int变量。分配成功没有任何问题:存储在字节中的值占用的内存少于int可以容纳的内存。小嵌套娃娃(字节值)很容易放入大嵌套娃娃(int变量)中。如果您尝试做相反的事情,即把一个大的值放入一个范围不能容纳如此大的数据类型的变量中,那就另当别论了。对于真正的嵌套娃娃,这个数字根本放不下。使用 Java,它可以,但有细微差别。让我们尝试将一个int放入一个short变量中:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = bigNumber;// Error!
System.out.println(bigNumber);
}
错误!编译器知道您试图通过将一个大嵌套娃娃 ( int ) 推到一个小嵌套娃娃 ( short ) 中来做一些不正常的事情。在这种情况下,编译错误是来自编译器的警告:“嘿,你确定要这样做吗?” 如果你确定,那么你告诉编译器:“一切都很好。我知道我在做什么!” 此过程称为显式类型转换或缩小。
在 Java 中缩小
要执行缩小转换,您需要明确指示要将值转换为的类型。换句话说,你需要回答编译器的问题:“嗯,你想把这个大嵌套娃娃放到这些小嵌套娃娃中的哪个?” 在我们的例子中,它看起来像这样:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = (short) bigNumber;
System.out.println(littleNumber);
}
我们明确表示我们想将一个int放入一个short变量中,我们将承担责任。看到已显式指示更窄的类型,编译器执行转换。结果如何?控制台输出: -27008 这有点出乎意料。为什么我们得到那个?事实上,这一切都很简单。原来,这个值是 10000000 ,它被存储在一个int变量中,它占用 32 位。这是它的二进制表示:
public static void main(String[] args) {
double d = 2.7;
long x = (int) d;
System.out.println(x);
}
控制台输出: 2
字符
您已经知道char用于显示单个字符。
public static void main(String[] args) {
char c = '!';
char z = 'z';
char i = '8';
}
但是这种数据类型有几个需要理解的重要特性。让我们再看一下取值范围表:
原始类型 | 内存大小 | 取值范围 |
---|---|---|
字节 | 8位 | -128 到 127 |
短的 | 16位 | -32768 至 32767 |
字符 | 16位 | 0 到 65536 |
整数 | 32位 | -2147483648 至 2147483647 |
长的 | 64位 | -9223372036854775808 至 9223372036854775807 |
漂浮 | 32位 | (2 的 -149 次方) 到 ((2 - (2 的 -23 次方)) * 2 的 127 次方) |
双倍的 | 64位 | (-2 的 63 次方) 到 ((2 的 63 次方) - 1) |
布尔值 | 8(在数组中使用时),32(如果不在数组中使用) | 对或错 |
public static void main(String[] args) {
int x = 32816;
char c = (char) x ;
System.out.println(c);
}
控制台输出:耰 这是 Java 中用于存储char 的 格式。每个符号对应一个数字:一个 16 位(两个字节)的数字代码。在 Unicode 中,32816 对应汉字耰。 请注意以下几点。在这个例子中,我们使用了一个int变量。它在内存中占用 32 位,而char占用 16 位。这里我们选择了int,因为我们的数字 (32816) 放不下short。尽管char的大小(就像short一样)是 16 位,但char范围内没有负数,因此char的“正数”部分范围是两倍大(65536 而不是short类型的 32767)。只要我们的代码保持在 65536 以下,我们就可以使用int。但是如果你创建一个大于 65536 的int值,那么它会占用超过 16 位。这将导致缩小转换
char c = (char) x;
多余的位将被丢弃(如上所述),结果将是非常出乎意料的。
添加字符和整数的特殊功能
让我们看一个不寻常的例子:
public class Main {
public static void main(String[] args) {
char c = '1';
int i = 1;
System.out.println(i + c);
}
}
控制台输出: 50 O_О 这有什么意义?1+1。哪来的50?!您已经知道char
值在内存中存储为 0 到 65536 范围内的数字,并且这些数字是字符的 Unicode 表示。 当我们添加一个char和一些整数类型时,char被转换为相应的 Unicode 数字。在我们的代码中,当我们添加 1 和 '1' 时,符号 '1' 被转换为它自己的代码,即 49(您可以在上表中验证这一点)。因此,结果是50。让我们再次以我们的老朋友耰为例,尝试将它加到某个数字上。
public static void main(String[] args) {
char c = '耰';
int x = 200;
System.out.println(c + x);
}
控制台输出: 33016 我们已经发现耰 对应 32816。当我们将这个数字与 200 相加时,我们得到结果:33016。:) 如您所见,这里的算法非常简单,但您不要忘记它.
更多阅读: |
---|
GO TO FULL VERSION