将long.MaxValue转换为int并将float.MaxValue转换为int有什么区别?

时间:2016-06-16 08:15:33

标签: c# types casting

我正在尝试了解某些​​数据类型与转换之间的差异。

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。

3 个答案:

答案 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十进制,因为intsigned,并且适用两个补码。

答案 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