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)そこにあります。longあなたはあなたをそのようにキャストしていますint。しかし、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 になります。すべての操作は int で行われるため、小数が取り除かれるため、結果は実際には 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 で 3 回割る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 に答える