我正在尝试了解某些数据类型与转换之间的差异。
public static void ExplicitTypeConversion2()
{
long longValue=long.MaxValue;
float floatValue = float.MaxValue;
int integerValue = (int) longValue;
int integerValue2 = (int)floatValue;
Console.WriteLine(integerValue);
Console.WriteLine(integerValue2);
}
当我运行该代码块时,它会输出:
-1
-2147483648
我知道如果要分配给整数的值大于整数可以保留的值,则返回整数的最小值(-2147483648)。
据我所知,long.MaxValue
远大于整数的最大值,但如果我将long.MaxValue
强制转换为int
,则返回-1。
这两个铸造有什么区别?我认为第一个也假设返回-2147483648而不是-1。
答案 0 :(得分:16)
如果要分配给大于该整数的整数的值可以保留,则返回整数的最小值
这不是一个规则。相关规则是
对于unchecked
上下文中的整数类型(即默认值):
如果源类型大于目标类型,则源值将被截断 丢弃其“额外”最重要的位。然后将结果视为目的地的值 类型。
对于unchecked
上下文中的float-> int:
该值向零舍入到最接近的整数值。如果这个积分值在 目标类型的范围,然后此值是转换的结果。 否则,转换结果是目标类型的未指定值。
关闭0x7fffffffffffffff
的32个前导位,使0xffffffff
也称为-1。
您从未接受过如果超出范围浮点数> int cast,您会得到int.MinValue
,但无论如何都要这样做,因为它易于实现:x64的转换指令{{ 3}}使0x80000000超出范围结果,同样cvtss2si(32位JIT使用的旧x87转换指令)存储"整数不定值"这是0x80000000。
答案 1 :(得分:6)
long.MaxValue
的二进制值为0111...111111
(零后跟63个)。当您转换为int
时,保持最低32位111...11111
。这是-1
十进制,因为int
是signed
,并且适用两个补码。
答案 2 :(得分:3)
让我解释一下:
long longValue=long.MaxValue;
float floatValue = float.MaxValue;
int integerValue = (int) longValue;
int integerValue2 = (int)floatValue;
long的最大值是9,223,372,036,854,775,807或0x7FFFFFFFFFFFFFFF,因此将其减少为0xFFFFFFFF后的2补码将返回带有减号位的0x00000001,在十进制中表示为-1。
另一方面,float的最大值是3.40282347E + 38,因此将它转换为int将值四舍五入为3E + 38并在减少它后使用2的补码我们得到十六进制值0x80000000减号位,有十进制的-2147483648。
所有这种情况都适用于有符号整数,结果在无符号整数上会有所不同。
参考:
https://msdn.microsoft.com/en-us/library/system.int64.maxvalue(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/system.single.maxvalue(v=vs.110).aspx