CodeGym/Java 博客/随机的/扩大和缩小原始类型
John Squirrels
第 41 级
San Francisco

扩大和缩小原始类型

已在 随机的 群组中发布
个会员
你好!随着您在 CodeGym 中的进步,您已经多次遇到原始类型。以下是我们对它们的了解的简短列表:
  1. 它们不是对象,代表存储在内存中的值
  2. 有几种
    • 整数:byteshortintlong
    • 浮点(小数)数:floatdouble
    • 逻辑值:布尔
    • 符号值(用于表示字母和数字):char
  3. 每种类型都有自己的取值范围:

原始类型 内存大小 取值范围
字节 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(如果不在数组中使用) 对或错
但除了具有不同的值外,它们在内存中占用的空间也不同。一个int占用的不仅仅是一个字节。多头比空头大原始人占用的内存量可以与俄罗斯套娃进行比较: 扩大和缩小原始类型 - 2 每个套娃内部都有可用空间。嵌套娃娃越大,空间就越大。一个大的嵌套娃娃()很容易容纳一个较小的int。它很容易安装,你不需要做任何其他事情。在 Java 中,当使用原语时,这称为隐式转换。或者换句话说,它被称为拓宽。

在 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 位。这是它的二进制表示:
扩大和缩小原始类型 - 3
我们把这个值写入一个short变量,它只能存储16位!因此,只有我们数字的前 16 位会被移到那里。其余的将被丢弃。结果,short 变量接收到以下值
扩大和缩小原始类型 - 4
十进制形式等于 -27008 这就是编译器要求您通过指示对特定类型的显式缩小转换来“确认”的原因。首先,这表明你对结果负责。其次,它告诉编译器在转换发生时要分配多少空间。毕竟,在最后一个示例中,如果我们将 int 值分配给 byte 变量而不是 short 那么我们只能使用 8 位,而不是 16 位,结果会有所不同。分数类型(floatdouble)有自己的缩小转换的过程。如果您尝试将小数转换为整数类型,小数部分将被丢弃。
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(如果不在数组中使用) 对或错
0 到 65536 的范围表示为char类型。但是,这是什么意思?毕竟,char不仅代表数字,还代表字母、标点符号……关键是在 Java 中,char值以 Unicode 格式存储。我们已经在之前的课程中遇到过 Unicode。您可能记得 Unicode 是一种字符编码标准,它包括世界上几乎所有书面语言的符号。换句话说,它是一个特殊代码列表,几乎可以代表任何语言中的每个字符。整个 Unicode 表非常大,当然没必要死记硬背。这是其中的一小部分: 扩大和缩小原始类型 - 5 最主要的是理解字符是如何存储的,并记住如果你知道特定字符的代码,你总是可以在你的程序中产生那个字符。让我们尝试一些随机数:
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 表示。 扩大和缩小原始类型 - 6 当我们添加一个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。:) 如您所见,这里的算法非常简单,但您不要忘记它.
评论
  • 受欢迎
你必须先登录才能发表评论
此页面还没有任何评论