我试图了解一些数据类型和转换之间的差异.
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.MaxValue为int它,则返回-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.
的二进制值long.MaxValue是0111...111111(零后跟63级的).转换为时int,保持最低32位111...11111.这是-1十进制,因为int是signed和补适用.
让我解释:
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
| 归档时间: |
|
| 查看次数: |
2422 次 |
| 最近记录: |