我很快就参加了考试,我希望有人检查我的解释,为什么编译器允许某些转换,而且有些转换不是。
字节 - >短 - > int - >长 - >浮动 - >双
所以我总是可以(从一个明确地)从小到大(例如从字节到长)。但要朝着这个方向前进< - 我必须明确地进行类型转换。到目前为止一切都那么好,但考试中的问题仍然有点棘手。
int value1 = (double) 10;
不允许。 Eclipse说不能从double转换为int。但是不是已经整数10了吗?我真的不明白。
byte value2 = (int) 120.0;
允许。所以120.0被削减到120,这是一个在一个字节范围内的整数。但是例如下面的
byte value3 = (int) 33500.0;
是不允许的。因为它不在一个字节的范围内?
double value4 = (int) 13.2;
允许。 13.2被切割为13,这是一个整数。你总是可以指定小到大。
int value = 10f;
不允许。因为你不能从float转换为int,但是
int value = (int) 10f
是允许的,因为它现在已经明确地投放了。
double someValue = (int) 12.3;
允许,我想。但这并没有多大意义,是吗?因为12.3已经是双倍了。
short v1 = (int) 42.0;
允许。但为什么??我以为你不能进入这个< - 方向。
答案 0 :(得分:4)
分配上下文允许使用以下之一:
- 身份转换(第5.1.1节)
- 扩大原始转换(第5.1.2节)
...
此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):
- 如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。
您的示例都可以用以下规则解释:
double value4 = (int) 13.2;
(int) 13.2
的类型为int
,因此会应用加宽的基元转换。
int value = (int) 10f;
(int) 10f
的类型为int
,因此会应用标识转换。
double someValue = (int) 12.3;
(int) 12.3
的类型为int
- 其值为12
- 因此会应用加宽的基元转换。 12.3是双精度的事实在这里是无关紧要的 - 你没有为变量分配12.3,你正在分配(int) 12.3 == 12
。
byte value2 = (int) 120.0; short v1 = (int) 42.0;
这些是允许的,因为表达式是int
类型的常量,它们的值可以分别用byte
和short
表示,因此适用缩小的原始转换情况。
int value1 = (double) 10; int value = 10f;
这是不允许的,因为它需要从浮点类型到int的缩小转换。只能隐式缩小某些常量整数值(不是long
)。
byte value3 = (int) 33500.0;
这是不允许的,尽管表达式为int
,因为(int) 33500.0 == 33500
超出了byte
的范围。
答案 1 :(得分:2)
有两种类型的投射:
您提到的字节序列 - >短 - > int - >长 - >浮动 - > double用于隐式类型转换。
Example:
short v1 = 4;
int i = v1;
System.out.print(i);
输出:4
我们在值之前使用(数据类型)将其更改为另一个的称为显式类型转换。这样我们可以将较大的数据类型值分配给较小的数据类型值。
Example:
short v1 = (int)42.0;
System.out.print(v1);
输出:42
希望你得到所有答案。