将 Double 转换为 Int

Casting Double to Int

我找到了一个铸造的例子。当我尝试将 long 转换为 int 时,我得到以下输出。

long e = 10;
int x = (int) e ;
WriteLine($"e is {e:N0} and x is {x:N0} ");
e = long.MaxValue;
x = (int) e;
WriteLine($"e is {e:N0} and x is {x:N0} ");
e = 5_000_000_000;
x = (int) e;
WriteLine($"e is {e:N0} and x is {x:N0} ");

对于情况 1,10 可以放入 int,所以没有问题,
对于情况 2,value -> long max value 不适合 int,因此输出为 1
对于案例 3,value = 5_000_000_000,它也不适合 int,因此它应该输出 1,但它输出 705,032,704 谁能解释为什么我们得到这个值?

以上代码的输出是:

e is 10 and x is 10 

e is 9,223,372,036,854,775,807 and x is -1

e is 5,000,000,000 and x is 705,032,704

您需要查看 (int)e 操作,例如 (e % int.MaxValue),因此在您的示例中您会得到以下内容:

long.MaxValue % int.MaxValue = 1

5000000000 % int.MaxValue = 705032704

原因是我们在幕后工作的是二进制,当我们转换为一个较小的二进制值时,我们从旧值中获取尽可能多的二进制位来创建我们的新值。

5,000,000,000 在二进制中是 100101010000001011111001000000000。如果我们将其放入 32 位(int 的大小),我们将得到 00101010000001011111001000000000。我们只是丢失了前导 1,因为原始数字是 33 位。如果我们将其转换为十进制,则为 705032704。

This converter看到这个很有用。

编辑:

对于long.MaxValue变为-1,我们必须了解我们如何用二进制表示负数。我们使用最左边的位。如果它是零,那么这个数字就是正数,如果它是一个,那么这个数字就是负数。因此,对于 64 位数字,最大正值为 0 加上 63 个 1:0111111111111111111111111111111111111111111111111111111111111111。如果我们有 64 个 1,则数字为负数,实际上负数的工作方式为 -1,显然这不是最大值值。

现在,如果我们取那个大二进制数最右边的 32 位,我们会连续得到 32 个 1,也就是 -1。 BBC 有 quite a good explanation of negative number representations in binary.