3

このことを考慮

        int i = 2147483647;
        var n = i + 3;
        i = n;

        Console.WriteLine(i);           // prints -2147483646    (1)
        Console.WriteLine(n);           // prints -2147483646    (2)
        Console.WriteLine(n.GetType()); // prints System.Int32   (3)

私は次のことと混同しています

  • (1)intはどのようにして値-2147483646を保持できますか?(int範囲= -2,147,483,648〜2,147,483,647)
  • (2)なぜこの印刷は-2147483648であるが、2147483648は印刷されないのですか(int範囲が超える場合、コンパイラはより適切な型を決定する必要があります)
  • (3)どこかで変換された場合、なぜn.GetType()がSystem.Int32を与えるのですか?

編集1:修正を行いました:これで、私が取得しているものを取得できます。(そのために残念)

var n = i + 1; に

var n = i + 3;

Edit2:もう1つ、オーバーフローとして発生した場合、例外が発生しないのはなぜですか?

追加:オーバーフローが発生すると、タイプを設定するのは正しくありませんか

var n

var n = i + 3;それに応じて別のタイプへのステートメントで?


これは意味がないので、より良いタイトルを提案することを歓迎します....少なくとも私

ありがとう

4

8 に答える 8

7

更新:ポスターは彼の質問を修正しました。

1)int.MaxValueに3を追加するとオーバーフローが発生するため、これは出力されると予想されます。.NETでは、デフォルトでは、これはチェックされていないコードでの正当な操作であり、負の値にラップアラウンドを与えますが、コードの周りにブロックを追加すると、代わりcheckedにスローされます。OverflowException

2)で宣言された変数の型は、var実行時ではなくコンパイル時に決定されます。2つのInt32を追加すると、UInt32、Int64などではなく、Int32が得られるという規則があります。したがって、実行時に結果がInt32には大きすぎることがわかりますが、それでもInt32を返す必要があります。

3)別のタイプに変換されません。

于 2010-02-14T01:25:34.607 に答える
3
 1)  -2147483646 is bigger than -2,147,483,648
 2) 2147483648 is out of range
 3) int is an alias for Int32
于 2010-02-14T01:26:44.043 に答える
3

1)
まず、変数の値は-2147483646ではなく、-2147483648です。テストを再実行して、結果を確認してください。

intが値-2147483646を保持できなかった理由はありません。-2147483648..2147483647の範囲内です。

2)
コンパイラは、変数のデータ型を式の結果の型として選択します。式はint値を返します。コンパイラが変数に対してより大きなデータ型を選択した場合でも、式はintを返し、結果として同じ値を取得します。

オーバーフローするのは式の演算であり、結果が変数に割り当てられたときではありません。

3)
どこにも変換されません。

于 2010-02-14T01:32:27.277 に答える
1
  1. これはオーバーフローです、あなたの数は回り込んで負になりました
  2. 実行時のループが同じことを引き起こす可能性があるため、これはコンパイラの仕事ではありません
  3. intはエイリアスであるかSystem.Int32、.Netでは同等です。
于 2010-02-14T01:25:49.520 に答える
1

これはビット表現によるものです

Int32を使用しますが、char(8ビット)についても同じことが言えます。

最初のビットは符号を保持し、次のビットは数値を保持します

したがって、7ビットで128の数値を表すことができます0111 1111

129番目を試すと1000 0001、符号ビットが設定されるため、コンピュータは代わりに-1と見なします。

于 2010-02-14T01:33:03.883 に答える
0

.NETの算術演算では、実際のタイプは変更されません。
(32ビット)整数から始めて、+3はそれを変更しません。

これを行うと、予期しないラウンド数が得られるのもそのためです。

int a = 2147483647;
double b = a / 4;

また

int a = 2147483647;
var b = a / 4;

そのことについては。

編集
.NETが数をオーバーフローするため、例外はありません。
オーバーフロー例外は、割り当て操作で、または例外を生成する条件を設定したときにMarkが説明したようにのみ発生します。

于 2010-02-14T01:37:39.577 に答える
0

16進表記を使用すると、これを簡単に行うことができます。

8番目のメルセンヌ素数が0x7FFFFFFFであることを誰もが知っているわけではありません

言ってるだけ'

于 2010-02-14T02:28:38.217 に答える
0

例外をスローする場合は、次のように記述します。

abc = checked(i+3)

代わりは。オーバーフローをチェックします。

また、c#では、デフォルト設定はオーバーフロー時に例外をスローしないようになっています。ただし、プロジェクトのプロパティのどこかでそのオプションを切り替えることができます。

于 2010-02-14T03:07:30.140 に答える