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

ツリー一括表示

Nomalアイコン C#のlong型でオーバーフローになる /つき (23/11/20(Mon) 11:56) #35543
Nomalアイコン Re[1]: C#のlong型でオーバーフローになる /Hongliang (23/11/20(Mon) 12:19) #35544
  └Nomalアイコン Re[2]: C#のlong型でオーバーフローになる /つき (23/11/20(Mon) 13:15) #35545


親記事 / ▼[ 35544 ]
■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)なので大丈夫では
    と思うのですが、なぜオーバーフローになるのでしょう?
    どなたがご教授お願いします!

違反を報告
[ □ Tree ] 返信 削除キー/

▲[ 35543 ] / ▼[ 35545 ]
■35544 / 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;
違反を報告
[ 親 35543 / □ Tree ] 返信 削除キー/

▲[ 35544 ] / 返信無し
■35545 / 2階層)  Re[2]: C#のlong型でオーバーフローになる
□投稿者/ つき 一般人(3回)-(2023/11/20(Mon) 13:15:53)
  • アイコンHongliangさん
    わかりやすい解説ありがとうございました。

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

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

    ありがとうございました。
違反を報告
[ 親 35543 / □ Tree ] 返信 削除キー/


Mode/  Pass/


- Child Tree -