【问题标题】:Literals and implicit narrowing conversions文字和隐式缩小转换
【发布时间】:2010-02-07 19:07:20
【问题描述】:

a) 下面的赋值不应该导致错误吗,因为数字 100 是 int 类型的文字,并且编译器不允许隐式缩小转换?

byte b = 100; 


b) 如果编译器没有抱怨从 int literal 到 type byte 的隐式窄化转换,那么为什么它也不允许从 double literal 到 type float (我意识到我们可以通过使用 F/f 后缀指定浮点文字来避免这个错误)?

byte b=16; //OK
float f1=16.9; //error


谢谢

【问题讨论】:

  • 关于浮点转换的规则是落后的,但它们就是它们。 float f = (float)(1.0 / 10.0); 没有充分的理由要求进行类型转换(f 将为其类型保留 0.1 的最精确表示),但即使分配给 d 的值为 (关于双精度)远不及 0.1。

标签: c# .net clr


【解决方案1】:

C# 语言规范的第 6.1.8 节对此进行了介绍。如果值在目标类型的范围内,则将 int 类型的常量表达式转换为 sbyte、byte、short、ushort、uint 或 ulong 是合法的。 C# 编译器很容易确定该值是否在适当的范围内,从而允许转换。

至于双重情况​​,C# 语言规范没有具体说明为什么不允许这样做。我的猜测是,它与确定双精度值是否适合浮点值有关。获得正确的浮点精度是一项非常艰巨的任务,而且可能如此之多,以至于它被认为不值得付出代价(如果可能的话)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多