为什么简单的算术不需要强制转换就不能工作?

本文关键字:转换 就不能 工作 不需要 简单 为什么 | 更新日期: 2023-09-27 18:06:43

我刚刚发现:

ushort i = 4;
i = i + 4;

给出编译错误:

不能隐式地将类型'int'转换为'ushort'。存在显式转换(您是否缺少强制类型转换?)

我必须这样修复它:

ushort i = 4;
i = (ushort)(i + 4);

这背后的原因是什么?难道使用所有数据类型不应该是显而易见和容易的吗?

为什么简单的算术不需要强制转换就不能工作?

文字4int,因此i + 4int的加法,i被提升为int。这个添加的结果也是int,所以你不能在没有强制类型转换的情况下将它赋值给ushort,因为c#不允许隐式转换到较小的数值类型。

原因是ushort + ushort实际上返回一个int。

这是因为编译器将4视为integer。从高级数据类型到低级数据类型的转换需要显式强制转换。

根据c#语言标准,特别是§2.4.4.2关于整数字面值的规定:

整型字面值的类型按如下方式确定:

如果字面量没有后缀,它具有以下类型中第一个可以表示其值的类型:int、uint、long、ulong。如果字面值以U或U为后缀,则它具有以下类型中可以表示其值的第一种类型:uint, ulong。如果字面值以L或L为后缀,则它具有可以表示其值的第一种类型:long, ulong。如果字面值的后缀为UL、UL、UL、UL、LU、LU、LU或LU,则为ulong类型。

所以你的数字被当作整型来处理,这就是为什么。

我认为从这些评论中得到的主要信息是int32只是当时通用架构使用的"默认"类型。我不知道当前处理器对较小整数类型的本机支持,但如果编译器在水下仍然将所有内容转换为int32,即使它是ushort,我也不会感到惊讶。

所以(u)short更像是程序员的验证约束,而不是内存节省器。即使它是一个内存节省器,如果需要更多的CPU周期来转换回和到usshort,我也不会感到惊讶。

整数类型的+ -操作只定义在intuintlongulong对之间。为了计算i+4,首先必须将iushort通过隐式数字转换转换为int,结果是相同类型的-也是int,因此i+4的类型实际上是int。由于没有隐式转换允许将int赋值给定义为ushort的变量,因此编译器会为i = i + 4给出错误。

注意,您仍然可以使用下面的语句,因为+=涉及隐式强制转换:

i += 4;
相关文章: