JavaRush /Java 博客 /Random-ZH /在 Java 中转换(转换)基本类型

在 Java 中转换(转换)基本类型

已在 Random-ZH 群组中发布
你好!在学习 JavaRush 时,您不止一次遇到原始类型。以下是我们对它们的了解的简短列表:
  1. 它们不是对象,代表存储在内存中的值
  2. 原始类型有以下几种类型:
    • 整数 - byteshortintlong
    • 浮点数(小数) -floatdouble
    • 布尔值 -boolean
    • 符号(表示字母和数字)-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需要超过byte. A-long超过short。基元占用的内存量可以与嵌套娃娃进行比较: 原始类型的扩展和收缩 - 2 嵌套娃娃内部有可用空间。嵌套娃娃越大,空间就越大。long我们可以轻松地将较小的娃娃放入大型嵌套娃娃中int。它很容易安装,您不需要做任何额外的事情。在 Java 中,当使用原语时,这称为自动转换。换句话说,它被称为扩展。这是一个简单的扩展示例:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
byte这里我们给一个变量 赋值int。分配成功并且没有任何问题:存储在 中的值byte占用的内存空间比它“适合”在 中的内存空间少int。“小嵌套娃娃”(值byte)很容易融入“大套娃”(变量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) 中。在这种情况下,编译错误是来自编译器的警告:“嘿,你确定要这样做吗?“如果你确定,请告诉编译器:“一切都好,我知道我在做什么!” ” 这个过程称为显式类型转换,或缩小。要缩小范围,您需要明确指示要将值转换为的类型。换句话说,回答编译器的问题:“那么,你想把这个大娃娃放入这些小娃娃中的哪一个?” ” 在我们的例子中,它看起来像这样:
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(用于非数组时) 对或错
该类型char的数值范围是 0 到 65536。但这是什么意思呢?毕竟,char这些不仅仅是数字,还有字母、标点符号……事实是,值char在 Java 中是以 Unicode 格式存储的。我们在之前的一堂课中已经接触过 Unicode。您可能还记得Unicode是一种字符编码标准,其中包括世界上几乎所有书面语言的字符。换句话说,这是一个特殊代码列表,其中几乎包含任何语言的任何字符的代码。一般的Unicode表很大,当然不需要死记硬背。例如,这里是其中的一部分: 原始类型的扩展和收缩 - 5 主要是了解存储值的原理char,并记住,知道特定符号的代码,您始终可以在程序中获取它。让我们用一些随机数来尝试一下:
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
控制台输出:耰 这是Java中字符存储的格式char。每个字符对应一个数字 - 16 位或两个字节的数字代码。Unicode 32816 对应于字符耰。注意这一刻。在这个例子中我们使用了变量int. 占用32位内存,而char16位。这里我们选择是因为我们需要的数字 32816 超出了范围。尽管大小与 Short 一样是 16 位,但范围内没有负数,因此“正”范围是两倍大(65536 而不是 32767 )。我们可以使用,只要我们的代码在65536的范围内。但是如果我们创建一个数字,它将占用超过16位。当缩小类型范围时: intshortcharcharcharshortintint >65536
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_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 :) 正如你所看到的,操作机制非常简单。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION