为什么Java中允许将双精度转换为字符?
为什么为什么Java中允许将双精度转换为字符?,java,casting,char,double,Java,Casting,Char,Double,为什么charc=(char)65.8在Java中允许吗 既然65.8不是一个精确的Unicode值,它不应该抛出一个错误吗?我知道double被截断为一个整数,在这种情况下,65,但在我看来,允许程序员进行这样的转换似乎是一个糟糕的设计。愚蠢的计算机怎么知道它的意图 char c = (char)65.8; // valid, double gets converted and explicitly truncated to a char 在计算过程中,您可能会进行一些复杂的计算,包括双重算
charc=(char)65.8代码>在Java中允许吗
既然65.8
不是一个精确的Unicode值,它不应该抛出一个错误吗?我知道double被截断为一个整数,在这种情况下,65
,但在我看来,允许程序员进行这样的转换似乎是一个糟糕的设计。愚蠢的计算机怎么知道它的意图
char c = (char)65.8; // valid, double gets converted and explicitly truncated to a char
在计算过程中,您可能会进行一些复杂的计算,包括双重算术,最后在最终值上应用指令并显示为字符。怎么了?这被称为窄型铸造。
发件人:
原语类型上的22个特定转换称为缩小
原语转换:
短到字节或字符
字符到字节或短字符
int到字节、short或char
长到字节、短、字符或整数
浮点到字节、短、字符、整型或长
双字节、短字节、字符、整型、长字节或浮点
缩小原语转换可能会丢失有关
数值的总大小,也可能会失去精度和
射程
在Java中,有两种基本类型的类型转换:加宽和缩小
从范围较小(或较窄)的类型转换为范围较大(或较宽)的类型时,会发生加宽转换。因此,不存在数据丢失的可能性,转换被认为是“安全的”。
从范围较大(或较宽)的类型转换为范围较小(或较窄)的类型时,会发生缩小转换。由于我们正在缩小范围,因此有可能丢失数据,因此此转换被视为“不安全”
从字节到字符的转换是一种特殊情况,同时表示加宽和缩小。转换首先将字节转换为int,然后将int转换为字符
我能想到为什么缩小类型转换不会导致错误/异常的一个原因是,在没有数据丢失的情况下,允许进行方便/简单/快速的类型转换。编译器让我们来确保转换后的数据能够适应较小的范围。如果我们想快速截断值,例如将double
的值四舍五入(通过将其类型转换为int
),它也很有用。赋值时不会自动发生:这将是一个编译错误
程序员做出有意识的选择(例如类型转换)这一事实意味着她正在考虑可能的截断的可能性和责任。您可能有密码算法之类的代码,可以将double
或float
转换为char
。另外,char
是一种无符号类型,这意味着(char)200.5
产生的内容不同于(char)(byte)200.5
问一个非常有效的问题,为什么这个计算被表示为类型转换而不是对静态方法的调用。char在哪里进行加宽和缩小转换?介于byte
和short
之间。这是有道理的,因为char
是16位。但是,为什么我们需要明确地将字节
转换为字符
,即使这应该是一个更广泛的转换?我明白了,将短
转换为字符
也会出现同样的情况,对吗?此外,这是否意味着每当一个字节
(或短
,取决于我的假设是否正确)被显式转换为另一个类型时,它总是首先转换为int
,然后转换为最后一个类型,或者这个特例仅与字符
s一起使用?否,字节
到字符
是一种特殊情况,包括变窄和加宽。正如我在回答中通过链接提供的,你可以在下面找到更多细节:将双字符转换为字符是否被视为不好的做法?这似乎不寻常,但是我确信有一个合理的用例存在。也许语言设计者无论如何都会实现这些特性,以防有人发现它的用途,而新手程序员犯错误的概率更高。我同意如果在这个场景中给出某种编译器警告会更好。顺便说一句,Java使用Unicode而不是ASCII。Java的char
数据类型存储一个UTF-16代码单元,其中一个或两个对Unicode码点进行编码。一个基本码点和零个或多个组合码点形成一个字形,这就是人们在使用术语“字符”时的想法