CodeGym /课程 /Java 语法 /类型转换

类型转换

Java 语法
第 10 级 , 课程 3
可用

“现在是最有趣的部分。接下来我要讲解类型转换。变量无法更改其类型,但有个位置可让你转换类型。这个位置就是赋值操作。

“你可以将一种类型的变量赋值到另一个类型。为此,一个变量的值(或特定类型)转换为其他类型的值并赋给其他变量。

“我们可以指出两种类型的转换:拓宽原始转换和窄化原始转换。拓宽就像将小篮子里的东西放到大篮子一样。这个过程是悄无声息地轻松完成。窄化就好比将大篮子里的东西放入小篮子。这样一来,空间就不足,你可能要扔掉一些东西。

“以下是根据‘篮子’大小排序的类型:”

类型转换 - 1

“不过注意几点:”

1. 尽管 char 的大小与 short 一样,但你也无法自由地在两者间移动值。值从 short 移动到 char 时,小于 0 的值总是丢失。值从 char 移动到 short 时,大于 32,000 的值会丢失。

2.整数转换成小数时,该数字最不重要的小数位会被丢弃。不过,这也是可接受的,因为分数的目的是存储近似值。”

执行窄化转换时,我们必须明确指令计算机我们没有发生错误:我们是故意舍弃部分数字。我们使用强制转换运算符即括号中的类型名称)执行此操作。”

“按照如下方式赋值不同类型变量:”

Java 语言代码 说明
byte a = 115;
int b = a;
拓宽原始转换。一切顺利。
int c = 10000;
byte d = (byte) c;
窄化原始转换我们必须明确指出应该丢弃多余的字节。
int c = 10;
byte d = (byte) c;
窄化原始转换。我们必须明确指出丢弃多余的字节,即使它们等于 0。
float f = 10000;
long l = (long) (f * f);
float f2 = l;
long l2 = (long) f2;
赋值给 float 类型时,将拓宽原始转换。赋值给 long 类型时,将窄化原始转换。需要强制转换运算符。
double d = 1;
float f = (float) d;
long l = (long) f;
int i = (int) l;
short s = (short) i;
byte b = (byte) s;
所有赋值操作均进行窄化转换,除了第一行。这些转换要求我们明确指示类型转换。

强制转换运算符必须在该数字的数字/变量被丢弃之前或窄化原始转化发生时放置。强制转换运算符仅影响紧随其后的数字/变量。”

Java 语言代码 说明
float f = 10000;
long l = (long) f * f;
两个变量中只有一个强制转换为 long: long 与 float 的乘积等于 float。
float f = 10000;
long l = (long) (f * f);
整个表达式被强制转换为 long 整数。

“我明白了。”

评论 (10)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
peifeng 级别 18,Hangzhou,China
19 十二月 2024
类型提升规则: 在Java中,当不同数据类型进行运算时,会发生自动类型提升。一般规则是向更大范围、更高精度的类型提升。 float vs long: 虽然long(64位)的位数比float(32位)多,但float是浮点类型,可以表示的数值范围比long更大。 精度vs范围: 在这种情况下,Java优先考虑的是数值范围而不是精度。float可以表示非常大的数(虽然可能损失精度),而long则有固定的上限。 语言设计决策: Java语言设计者认为在大多数情况下,保留小数部分(即使损失一些精度)比截断为整数更有用。 一致性: 这个规则与其他类型转换保持一致,如int和float相乘结果是float。 避免信息丢失: 将结果转为long可能会导致小数部分的完全丢失,而float至少能保留一定的小数信息。 需要注意的是,虽然结果是float,但可能会损失精度,特别是当涉及很大的long值时。如果需要更高的精度,应考虑使用double或BigDecimal。
Noob_Coder 级别 22,Springfield,United States Expert
3 七月 2024
这地方就体现了Java的辣鸡封装的太好底层逻辑看不到, 建议好好读读C_Primer体会以下这些知识的深层含义.
HOHOZ 级别 11,Australia
28 十一月 2023
他这里没说清楚,类型转化时的大小根据的是取值范围的大小,而不是单纯的字节占用大小(参考前一节的表)。float类型的取值范围是-10^1023 ..10^1023,long只有-9*10^18 ..9*10^18,float取值范围更大所以类型隐式转换会变成float。
hello world 级别 22,shanghai,China
20 十月 2021
"两个变量中只有一个强制转换为 long: long 与 float 的乘积等于 float。"??? long与float的乘积不应该是long?
UMKevinGe 级别 20,Nanjing,China
11 十一月 2021
是float. 小类型*大类型 得到 大类型
hello world 级别 22,shanghai,China
8 十二月 2021
是的,但是float类型占4字节,long类型占用8字节,所以会以为long类型大于float,其实不是。
Super Ego 级别 14,Wu Han,China
6 三月 2023
感觉float大于long这个应该点出来并说明原因比较好,小白看到这也很迷惑
7 八月 2021
高字节转换低字节会截取右边对应字节
Max Boom 级别 18,Zlin,Czech Republic
4 六月 2020
打卡
Max Boom 级别 18,Zlin,Czech Republic
4 六月 2020
2020-6-4