DOBON.NETプログラミング道掲示板

■35543 / 親記事)  C#のlong型でオーバーフローになる
  
□投稿者/ つき 一般人(1回)-(2023/11/20(Mon) 11:56:18)
  • アイコン環境/言語:[C#] 
    分類:[.NET] 

    初歩的なことだと思いますが、数値型変数の扱いについて質問です
    long型の変数ansに数値や計算式を入れた場合にこうなります

    @正常
     long ans;
    ans = 2500000000; ・・・正常

    Aエラーケース
     long ans;
     ans = 50000 * 50000; ・・・50000と入力した時点でオーバーフローになります。

    どちらもlong型の範囲内(-9,223,372,036,854,775,808 から 9,223,372,036,854,775,807)なので大丈夫では
    と思うのですが、なぜオーバーフローになるのでしょう?
    どなたがご教授お願いします!

マルチポストを報告
違反を報告
引用返信 削除キー/
■35544 / ResNo.1)  Re[1]: C#のlong型でオーバーフローになる
□投稿者/ Hongliang 大御所(648回)-(2023/11/20(Mon) 12:19:23)
  • アイコン>  ans = 50000 * 50000; ・・・50000と入力した時点でオーバーフローになります。
    1. C#において、接尾辞のない整数値は、intとして扱われます。
    2. int同士の演算はintを返します。
    この仕様のため、50000 * 50000はintで計算され、intの上限である約21億を超える25億となってオーバーフローになります。

    接尾辞Lを付けるとかします。
    ans = 50000L * 50000;
    // 1つ目の50000はlong型になり、long * intはlong型を返します。

    50000が変数なら、明示的にキャストするという方法もあります。
    int x = 50000;
    ans = (long)x * x;
違反を報告
引用返信 削除キー/
■35545 / ResNo.2)  Re[2]: C#のlong型でオーバーフローになる
□投稿者/ つき 一般人(3回)-(2023/11/20(Mon) 13:15:53)
  • アイコンHongliangさん
    わかりやすい解説ありがとうございました。

    > 1. C#において、接尾辞のない整数値は、intとして扱われます。
    > 2. int同士の演算はintを返します。

    このこと、全然知らずにやってました。
    原因がわかって助かりました。
    これからは変数の特性にも気を付けていこうと思います。

    ありがとうございました。
違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -