【问题标题】:Why does converting from a double to a short give a different answer than from a short to a double? [duplicate]为什么从 double 转换为 short 与从 short 转换为 double 给出不同的答案? [复制]
【发布时间】:2020-06-24 15:12:08
【问题描述】:

这可能是一个非常简单的答案,但我无法弄清楚这种情况下的问题所在。 我想将 double 转换为 short(反之亦然),但这样做会得到不同的结果。

例如:

double test = 33768; test=33769
short valuetest = (short)test; valuetest = -31768

short test2 = -31768; test2 = -31768
double valuetest2 = (double) test2; valuetest2 = -31768

在我的用例中,valuetest2 的值应该是 33768,或者这就是我试图完成的任务。实现此结果的更好方法是什么?或者有人可以通过将第一个测试的值从 33769 转换为 -31768 来解释为什么?提前致谢!

【问题讨论】:

  • 签名短裤可以存储从 -32768 到 +32767 的值。
  • 鸽巢原理应该告诉您,不可能由 64 位双精度表示的每个唯一值都映射到唯一的 16 位短整数,更不用说往返返回原始值了。跨度>
  • Explicit Numeric Conversions 中记录了这一点:当您将 double 或 float 值转换为整数类型时,该值会向零舍入到最接近的整数值。如果生成的整数值超出目标类型的范围,则结果取决于溢出检查上下文。在已检查的上下文中,会引发 OverflowException,而在未检查的上下文中,结果是目标类型的未指定值
  • 为了避免这种混淆,您可以使用checked,如接受的Best (safest) way to convert from double to int 答案所示——同样的答案适用于转换为shortint。事实上,我认为这可能是重复的,同意吗? Why casting big double value in sbyte returns 0 in C#?Weird result from unchecked(), possible compiler bug? 也可能适用。

标签: c# casting


【解决方案1】:

This Microsoft article 可以帮助你。您的值超出了短值的范围,因此它变为负值。这是因为负数通常用二进制表示,称为二进制补码。有关二进制补码的更多信息,请参阅this Wiki article

简而言之,考虑值 32768,它比空头的最大值大一。在这种情况下,二进制中的前导数字变为 1,这会改变符号并使该值成为 short 的最小值。

更进一步,32769 作为空头的值应该是 -32767,32770 应该是 -32766,以此类推。

【讨论】:

  • "值 33768 比 short 的最大值大 1" 不,是 1001。
  • 哎呀,错过了。固定。
  • 感谢您的解释!
猜你喜欢
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 2015-10-22
  • 2020-07-22
相关资源
最近更新 更多