我在阅读如何从 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
。