Я читал How can one simplify network byte-order conversion from a BinaryReader?, и исходный код в вопросе заставлял меня думать о возможностях явного литья между UInt32
и Int32
. Моя основная проблема заключается в значениях, превышающих Int32.MaxValue
или менее 0
.Литье UInt32 в Int32: результаты других компиляторов
Эти забросы должны быть эквивалентны, но один работает, а другой вызывает ошибку:
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
.
Где это задокументировано? http://msdn.microsoft.com/en-us/library/2xf6xbyc.aspx, http://msdn.microsoft.com/en-us/library/aa288039.aspx. MSDN может ответить практически на любой вопрос об основных вещах. – cHao
Очень ясно, что 1-й является «переменным», поэтому компилятор не знает, что могло бы произойти там, где второй - «Константа», поэтому компилятор знает диапазон и жалуется на вас как на ошибку. –
Is Convert.ToInt32 (uint) та же операция, что и (Int32) (uint)? –