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

Tun*_*caf 12 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);            
    }
Run Code Online (Sandbox Code Playgroud)

当我运行该代码块时,它输出:

-1
-2147483648
Run Code Online (Sandbox Code Playgroud)

我知道如果要分配给整数的值大于该整数可以保留的值,则返回整数的最小值(-2147483648).

据我所知,long.MaxValue它比一个整数的最大值大得多,但是如果我转换long.MaxValueint它,则返回-1.

这两个铸件有什么区别?我认为第一个也假设返回-2147483648而不是-1.

har*_*old 16

如果要分配给大于该整数的整数的值,则返回整数的最小值

这不是一个规则.相关规则是

对于unchecked上下文中的整数类型(即默认值):

如果源类型大于目标类型,则通过丢弃其"额外"最高有效位来截断源值.然后将结果视为目标类型的值.

对于unchecked上下文中的float-> int :

该值向零舍入为最接近的整数值.如果此整数值在目标类型的范围内,则此值是转换的结果.否则,转换的结果是目标类型的未指定值.

砍掉32个关闭的前导位0x7fffffffffffffff给出了0xffffffff-1.

你永远不会承诺你会得到int.MinValue超出范围的float-> int cast,但是你仍然会这样做,因为它很容易实现:x64的转换指令cvtss2si使得0x80000000超出范围结果,同样也是help(旧的x87转换指令) 32位JIT)存储"整数不定值",即0x80000000.


Ahm*_*bbi 6

的二进制值long.MaxValue0111...111111(零后跟63级的).转换为时int,保持最低32位111...11111.这是-1十进制,因为intsigned和补适用.


Tet*_*oto 3

让我解释:

long longValue=long.MaxValue;
float floatValue = float.MaxValue;
int integerValue = (int) longValue;
int integerValue2 = (int)floatValue;
Run Code Online (Sandbox Code Playgroud)

long 的最大值为 9,223,372,036,854,775,807 或 0x7FFFFFFFFFFFFFFFFF,因此 2 的补码减为 0xFFFFFFFF 后将返回带负号位的 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