1

我在阅读如何从 BinaryReader 简化网络字节顺序转换?问题中的初始代码让我想到了UInt32和之间显式转换的功能Int32。我主要关心的是大于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 结构表明,由于UInt32不是公共语言规范Int64的一部分,因此当您需要表示高于Int32.MaxValue但低于的值时,您应该只使用 an并浪费一半位UInt32.MaxValue

4

1 回答 1

1

您布置代码的方式,您只是在处理编译器确定潜在结果的能力。没有什么真正改变。正如错误消息向您建议的那样,您可以这样做并得到完全相同的结果:

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

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

于 2013-08-01T20:32:43.283 回答