【发布时间】:2013-08-01 20:18:27
【问题描述】:
我正在阅读How can one simplify network byte-order conversion from a 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 Structure 建议由于UInt32 不是Common Language Specification 的一部分,因此您应该只使用Int64 并在需要表示高于Int32.MaxValue 但低于UInt32.MaxValue 的值时浪费一半位.
【问题讨论】:
-
记录在哪里? msdn.microsoft.com/en-us/library/2xf6xbyc.aspx,msdn.microsoft.com/en-us/library/aa288039.aspx。 MSDN 几乎可以回答有关基本内容的任何问题。
-
很明显,第一个是
variable,所以编译器无法猜测第二个是Constant时会发生什么,所以编译器知道范围并将您投诉为错误。跨度> -
Convert.ToInt32(uint)和(Int32)(uint)的操作一样吗?
-
但是如果它是有效的运行时操作,为什么编译器会抱怨呢?
-
Convert.ToInt32(uint) 是与 (Int32)(uint) 不同的操作。第一个抛出异常(相当预期),第二个似乎根据值的位表示转换得很好。 (这是 C++ 中的行为,但我更希望 C# 中出现异常)。
标签: c# casting uint explicit-conversion