我正在为我的考试而学习,我发现在java中从byte转换为char被认为是缩小的。根据这本书,char的存储与byte相同,但它仍然被认为是缩小的。有人能解释一下原因吗?
此外,从字节转换为字符也是一个缩小范围!我认为如果A> B然后B
我知道这是一个愚蠢的问题。
答案 0 :(得分:2)
char
到byte
可能被有效地视为Java中的缩小转换,因为它引入了信息丢失的可能性。虽然char
确实是8位数且char
是16位,但请记住,byte
是Java中唯一的无符号基本类型。这意味着将char
转换为127
会截断任何负值。反向转换也在缩小,因为转换为byte
时,任何大于signed
的数字都将被截断。 Java的转换方式与C ++不同,unsigned
到<!-- START:LEFT -->
<table width="295" align="left" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
Left
</td>
</tr>
</tbody>
</table>
<!-- END:LEFT -->
<!-- START:RIGHT -->
<table width="295" align="right" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
Right
</td>
</tr>
</tbody>
</table>
<!-- END:RIGHT -->
只意味着编译器会以不同方式解释这些位,但实际数字不会改变。
答案 1 :(得分:1)
实际上,从byte
转换为char
需要 扩展和缩小转换(一个接一个)。这正是Java语言规范所要求的。在section 5.5:
转换上下文允许将强制转换运算符(第15.16节)的操作数转换为强制转换运算符明确指定的类型。
投射上下文允许使用以下之一:
(...)
- 扩大和缩小原语转换(第5.1.4节)
本书中的表看起来不正确(我假设标题应该是“Java缩小转换”)。从byte
到char
没有缩小转化。实际的扩展和缩小基元转换列在JLS部分5.1.2和5.1.3中。
请注意,char
只能通过缩小转化转换为byte
,但byte
无法仅通过扩展转换转换为char
。 (并且,为了使事情变得更加复杂,char
和short
之间的转换是两个方向的缩小转换!)。
简单地回答您的问题:是,原始转换为char
始终是narrowing
转化 - ,但可能需要首先执行扩展转化!的。