3

在我当前的项目中将字节转换为千兆字节时遇到了一些麻烦。最初我是这样做的:

 long requiredDiskSpace = 5000000000000; // In bytes
 int gb = (int)requiredDiskSpace / 1024 / 1024 / 1024;

此计算变为 0。(正确应为 4 656)。然后我切换到decimal类型,如下所示:

 long requiredDiskSpace = 5000000000000; // In bytes
 decimal gb = requiredDiskSpace / 1024 / 1024 / 1024;
 int gbAsInt = (int)gb;

这个计算(正确)得出gbAsInt4 656。

现在,我的问题很简单;为什么?对我来说,计算看起来很相似,因为我对任何十进制数字都不感兴趣,我不明白为什么我不能在实际计算中只使用 int 。

4

7 回答 7

9

您正在尝试将 5000000000000 转换为整数。这将无法正常工作,因为该数字大于Int.MaxValue所以您实际上应该这样做:

int gb = (int)(requiredDiskSpace / 1024 / 1024 / 1024);
于 2012-08-23T07:50:49.547 回答
8

问题是(int)requiredDiskSpace,这个值5000000000000对于整数来说太大了。

于 2012-08-23T07:49:55.183 回答
5

你的问题就(int)在那里。你正在longint那个方向投掷你的。但是 5000000000000 不能适合 32 位整数,因此您最终会得到一个完全不同的数字,介于 -2 31和 2 31之间。将其除以 1073741824 得到 0。

我怀疑您只是希望将结果转换为int

int gb = (int)(requiredDiskSpace / 1024 / 1024 / 1024);
于 2012-08-23T07:51:16.977 回答
4

原因是你的演员。如果使用括号,它将正常工作:

(int)(requiredDiskSpace / 1024 / 1024 / 1024)

您的代码中发生的情况是:

  1. 5000000000000 被强制转换为 int,由于整数溢出导致 658067456。
  2. 658067456 除以 1024 得到 642644
  3. 642644 除以 1024 得到 627.58203125。由于所有操作都在整数上进行,因此结果实际上是 627,因为小数被去掉了。
  4. 627 除以 1024 得到 0.6123.. 再一次,小数被去掉,你最终得到0
于 2012-08-23T07:50:34.527 回答
3

计算后投射:

    long requiredDiskSpace = 5000000000000; // In bytes
    int gb = (int)(requiredDiskSpace / 1024 / 1024 / 1024);

当您立即转换为 int 时,您将失去价值。

于 2012-08-23T07:51:15.073 回答
2

您正在将字节值转换为int,它无法容纳如此大的数字。

long test = 5000000000000;
int value = (int)test; // value = 658067456

将此值除以 1024 三倍将导致627 / 1024等于(整数运算)0

于 2012-08-23T07:53:40.853 回答
1

因为当您使用整数除法时,结果每次都会被截断为整数。
所以你在第一次尝试时为零,即使因为 5000000000000 太大而无法存储在 int var 中。
你应该使用

double gb = 1.0d * requiredDiskSpace / (1024 * 1024 * 1024);
于 2012-08-23T07:49:06.417 回答