Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java中允许将双精度转换为字符?_Java_Casting_Char_Double - Fatal编程技术网

为什么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码点进行编码。一个基本码点和零个或多个组合码点形成一个字形,这就是人们在使用术语“字符”时的想法