1. 类型转换
基本类型的变量(类型除外boolean
)用于存储各种类型的数字。尽管变量的类型从未改变,但在某个地方您可以从一种类型转换为另一种类型。那个地方就是assignment。
不同类型的变量可以相互赋值。执行此操作时,一种类型的变量值将转换为另一种类型的值并分配给第二个变量。在这方面,我们可以识别两种类型转换:扩大和缩小。
扩大就像将一个值从一个小篮子移动到一个大篮子:这个操作是无缝且无痛的。当您将一个值从一个大篮子移到一个小篮子时,就会发生变窄:可能没有足够的空间,您将不得不扔掉一些东西。
以下是按篮子大小排序的类型:
2. 扩大类型转换
通常需要将一种数值类型的变量赋值给另一种数值类型的变量。你是怎样做的?
Java 有 4 种整数类型:
类型 | 尺寸 |
---|---|
byte |
1 byte |
short |
2 bytes |
int |
4 bytes |
long |
8 bytes |
存储在较小篮子中的变量总是可以分配给存储在较大篮子中的变量。
int
,short
变量byte
可以很容易地分配给long
变量。short
变量byte
可以赋值给int
变量。并且byte
变量可以赋值给short
变量。
例子:
代码 | 描述 |
---|---|
|
这段代码将编译得很好。 |
这种从较小类型到较大类型的转换称为扩大类型转换。
实数呢?
有了它们,一切都一样——大小很重要:
类型 | 尺寸 |
---|---|
float |
4 bytes |
double |
8 bytes |
float
double
变量可以毫无问题地赋值给变量。但是整数类型的事情更有趣。
您可以将任何整数变量分配给一个float
变量。即使long
是 8 字节长的类型。您可以将任何您想要的 - 任何整数变量或float
变量 - 分配给一个double
变量:
代码 | 笔记 |
---|---|
|
|
请注意,由于缺少足够的有效数字,转换为实数类型可能会导致精度损失。
从整数转换为浮点数时,数字的低阶部分可能会被丢弃。但由于小数被理解为存储近似值,因此允许进行此类赋值操作。
3.缩小类型转换
那其他的可能性呢?如果需要long
给int
变量赋值怎么办?
将变量想象成一个篮子。我们有各种大小的篮子:1、2、4 和 8 字节。将苹果从较小的篮子转移到较大的篮子不是问题。但是,当从较大的篮子转移到较小的篮子时,一些苹果可能会丢失。
这种从较大类型到较小类型的转换称为缩小类型转换。当执行这样的赋值操作时,数字的一部分可能根本不适合新变量,因此可能会被丢弃。
缩小类型时,我们必须明确告诉编译器我们没有犯错,我们是故意丢弃部分数字。类型转换运算符用于此。它是括号中的类型名称。
在这种情况下,Java 编译器要求程序员指定类型转换运算符。一般来说,它看起来像这样:
(type) expression
例子:
代码 | 描述 |
---|---|
|
每次都必须显式指示类型转换运算符 |
这里a
等于1
,也许类型转换运算符看起来有点矫枉过正。但如果a
更大呢?
代码 | 描述 |
---|---|
|
|
一百万完全适合 along
和 an int
。但是给一个short
变量赋值一百万时,前两个字节被丢弃,只保留最后两个字节。当分配给 a 时byte
,唯一剩下的就是最后一个字节。
数字在内存中的排列方式:
类型 | 二进制符号 | 十进制表示法 |
---|---|---|
int |
0b 00000000 00001111 01000010 01000000 | 1000000 |
short |
0b 01000010 01000000 | 16.960 |
byte |
0b 01000000 | 64 |
char
类型
Achar
和 a 一样short
,占用两个字节,但要将一个字节转换为另一个字节,您始终需要使用类型转换运算符。这里的问题是short
类型是有符号的并且可以包含从-32,768
到的值+32,767
,但是类型是无符号的并且可以包含从到的char
值。0
65,535
负数不能存储在 a 中char
,但可以存储在 a 中short
。并且 ashort
不能存储大于的数字32,767
,但是这样的数字可以存储在 a 中char
。
4. 表达式类型
如果在同一个表达式中使用不同类型的变量怎么办?从逻辑上讲,我们理解首先需要将它们转换为通用类型。但是哪一个?
当然是大一点的。
Java 总是转换为更大的类型。粗略地说,首先扩大其中一个类型,然后才使用相同类型的值执行操作。
如果表达式中包含anint
和a long
,则将a的值int
转换为a long
,然后才进行操作:
代码 | 描述 |
---|---|
|
a 将扩大到 along 然后添加将发生。 |
浮点数字
如果表达式中涉及整数和浮点数(float
或double
),则将整数转换为浮点数(float
或double
),然后才执行运算。
如果操作涉及 afloat
和 a double
,则 thefloat
将转换为 a double
。这实际上是预期的。
、和类型在相互交互时byte
总是转换为。该类型被视为标准整数类型是有充分理由的。short
char
int
int
如果将 a 乘以byte
a short
,您将得到 an int
。如果将 a 乘以byte
a byte
,您将得到 an int
。即使您添加 abyte
和 a byte
,您也会得到 an int
。
有几个原因。例子:
代码 | 描述 |
---|---|
|
110 * 120 是13,200 ,它略大于该byte 类型的最大值:127 |
|
110 + 120 是230 ,它也略大于该byte 类型的最大值:127 |
一般来说,一个8位(1字节)的数乘以一个8位(1字节)的数,得到一个占用16位(2字节)位的数
因此,所有具有小于 的整数类型的操作int
总是立即转换为int
s。这意味着如果您想将计算结果存储在类型小于 的变量中int
,那么您将始终需要显式指定类型转换运算符。
例子:
代码 | 描述 |
---|---|
|
该byte * byte 表达式将是一个int |
|
该byte + byte 表达式将是一个int |
|
表达式byte + int 将是 anint 字面值是 an int 。 |
5.一个重要的细微差别
类型转换运算符具有相当高的优先级。
这意味着如果表达式包含,例如,加法和类型转换运算符,则类型转换将在加法之前执行。
例子:
代码 | 描述 |
---|---|
|
类型转换运算符将仅应用于a 已经是byte . 这段代码不会编译。 |
|
这是正确的方法。 |
如果要将整个表达式转换为特定类型,而不仅仅是表达式的一个组成部分,则将整个表达式括在括号中并将类型转换运算符放在前面。
GO TO FULL VERSION