将 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.
我找到了一个铸造的例子。当我尝试将 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.