将 Double 转换为 Int

Sar*_*ian 1 c# c#-10.0

我找到了一个铸造的例子。当我尝试转换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} ");
Run Code Online (Sandbox Code Playgroud)

对于情况 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
Run Code Online (Sandbox Code Playgroud)

Ric*_*h N 5

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

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

这个转换器对于看到这一点很有用。

编辑:

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

现在,如果我们取这个大二进制数的最右边的 32 位,我们会得到连续的 32 个 1,即 -1。BBC对二进制负数表示有很好的解释