将UInt32转换为Int32:不同的编译器结果

时间:2013-08-01 20:18:28

标签: c# casting uint explicit-conversion

我正在阅读How can one simplify network byte-order conversion from a BinaryReader?,问题中的初始代码让我思考UInt32Int32之间显式演员的能力。我主要担心的是值大于Int32.MaxValue或小于0

这些演员表应该是等效的,但是一个有效,另一个有误:

public static void TestConverstion()
{
    // runs just fine, CastBack == aUInt
    UInt32 aUInt = UInt32.MaxValue; // 4294967295
    Int32 anInt = (Int32)aUInt; // -1
    UInt32 castBack = (UInt32)aUInt; // 4294967295

    // Build Error: Constant value '4294967295' cannot be converted to a 'int' (use 'unchecked' syntax to override) 
    UInt32 oneLineCastBack = (UInt32)(Int32)UInt32.MaxValue;
}

为什么一个有效而另一个无效?

此演员的行为记录在哪里?我能找到的最好的文档是Explicit Numeric Conversions Table (C# Reference),它承认有一个显式的强制转换,但警告显式强制转换“可能导致精度损失或导致抛出异常”。实验表明,没有抛出任何异常,精确度也没有丢失。

UInt32 Structure表示由于UInt32不属于Common Language Specification,因此您只需使用Int64并在需要表示上述值时浪费一半的比特Int32.MaxValue但低于UInt32.MaxValue

1 个答案:

答案 0 :(得分:1)

您编写代码的方式,您只是处理编译器确定潜在结果的能力。什么都没有改变。正如错误消息向您建议的那样,您可以执行此操作并获得完全相同的结果:

unchecked { UInt32 oneLineCastBack = (UInt32)(Int32)UInt32.MaxValue; }

您给出的两个示例之间的唯一区别是第二个示例是const值到Int32直接转换,编译器可以立即将其识别为错误。