【问题标题】:Converting Float to Long gives negative value将 Float 转换为 Long 会产生负值
【发布时间】:2015-09-14 04:23:09
【问题描述】:

为什么转换回来会给出 -ve 表达式?

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.

输出:

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

同样,long.MinValue 给出了正确的结果。

【问题讨论】:

  • @txtechhelp:第一个链接中的提问者不知道积分和浮点在内存中的表示方式,而第二个链接中的提问者希望获得浮点类型的精确值。但是我的问题的背景不同。如果浮点数没有给出确切的值,但它没有给出负值...?
  • 您没有转换为 long。你正在铸造很长。嗯,这有点不同!
  • 是的,这是显式转换,我也尝试过转换......结果相同。添加到问题中。
  • float f = long.MaxValue; Console.WriteLine(Convert.ToInt64(f)); System.OverflowException:算术运算导致溢出。

标签: c# floating-point type-conversion long-integer


【解决方案1】:

正如 M.kazem 在评论中所建议的那样,它导致了溢出,并且根据 C# 规范编译器默默地忽略它

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

但是如果我们在上面的 underchecked 下进行转换,则会抛出一个溢出表达式。

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

【讨论】:

  • 是的。如果我发现为什么铸造会产生负值,请告诉你。
  • 对于 C# 项目,默认情况下禁用算术溢出检查。
  • 对于负值,我认为问题在于指定long 符号的最高位。将 uint 转换为 int 时也是如此。如果 uint 大于 int.max 它给出负数,因为最高位指定符号。 stackoverflow.com/a/1131851/4767498
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多