为什么我不能使用int来计算字节到千兆字节?

时间:2012-08-23 07:47:14

标签: c#

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

 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;

此计算(正确)使gbAsInt 4 656。

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

7 个答案:

答案 0 :(得分:9)

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

int gb = (int)(requiredDiskSpace / 1024 / 1024 / 1024);

答案 1 :(得分:8)

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

答案 2 :(得分:5)

你的问题是(int)。您将long投射到int那样。但是5000000000000不能适合32位整数,所以你最终得到的数字完全不同于-2 31 和2 31 。除以1073741824然后得到0。

我怀疑你只是希望将结果投放到int

int gb = (int)(requiredDiskSpace / 1024 / 1024 / 1024);

答案 3 :(得分: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

答案 4 :(得分:3)

计算后投射:

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

当你立即施放到int时,你会失去价值。

答案 5 :(得分:2)

您正在将字节值转换为int,而long test = 5000000000000; int value = (int)test; // value = 658067456 无法容纳如此大的数字。

627 / 1024

将此值除以1024的三次将导致0等于(整数运算){{1}}。

答案 6 :(得分:1)

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

double gb = 1.0d * requiredDiskSpace / (1024 * 1024 * 1024);