将浮点数转换为长整型会得到负值

3
为什么进行逆变换会得到一个负数表达式?
float f = long.MaxValue;

Console.WriteLine("long to float: {0}",f);
Console.WriteLine("long Max: {0}",long.MaxValue);
Console.WriteLine("float to long casting: {0}",(long)f);
//Console.WriteLine("converting float to long: {0}",Convert.ToInt64(f));
//Above statement gives OverflowExection as expected.

OUTPUT:

long to float: 9.223372E+18
long Max: 9223372036854775807
float to long casting: -9223372036854775808

再次提醒,long.MinValue 给出了正确的结果。


看这里:https://dev59.com/K1LTa4cB1Zd3GeqPaGU3 和这里:https://dev59.com/VX7aa4cB1Zd3GeqPq36h - txtechhelp
@txtechhelp:第一个链接中的提问者不知道整数和浮点数在内存中是如何表示的,第二个链接中的提问者想要从浮点类型得到精确值。但是我的问题背景不同。如果float不能给出精确值,那么负值呢? - Marshal
你不是在转换为长整型,而是在强制类型转换为长整型。这两者有点不同! - M.kazem Akhgary
是的,那是显式转换,我也尝试过转换...结果一样。已添加到问题中。 - Marshal
我会将答案作为评论给出!因为我不确定,也没有参考资料。我认为这是因为浮点数是浮点数而不是精确的,它将超出 long 的范围(因为它已经是 long.max),强制转换只会产生意外的结果(我不知道为什么)。但是,如果你尝试使用 Convert.ToInt64,你会得到溢出异常。 - M.kazem Akhgary
显示剩余3条评论
1个回答

0
正如M.kazem在评论中建议的那样,这导致了溢出,并且根据C#规范,编译器默默忽略了它。
Console.WriteLine("float to long casting: {0}",(long)f);

但是,如果我们将上述内容转换为已检查的形式,则会抛出溢出表达式。

checked 
{
   Console.WriteLine("float to long casting: {0}",(long)f);
}

如果我找到为什么类型转换会产生负值的原因,我会告诉你。 - M.kazem Akhgary
对于 C# 项目,默认情况下禁用算术溢出检查。 - Ganesh R.
对于负值,我认为问题在于指定 long 符号的最高位。当你将 uint 转换为 int 时也是如此。如果 uint 大于 int.max,它会给出负值,因为最高位指定符号。https://dev59.com/ZHNA5IYBdhLWcg3wAIxP#1131851 - M.kazem Akhgary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接