3

このようなテストを行うための基本的なコンソールアプリケーションを作成しました。

        short val = 32767;

        val++;

        Console.WriteLine(val);

これにより、期待される結果として-32768が得られます

        short val = 32767;

        val = val +1;

        Console.WriteLine(val);

しかし、これは私にこのエラーを与えます

エラー1**タイプ'int'を'short'に暗黙的に変換できません。明示的な変換が存在します(キャストがありませんか?)

何が原因なのか気になりますか?

前もって感謝します、

4

8 に答える 8

12

操作の結果はshort + shortとして定義されますint。最初のケースでは、コンパイラは先に進み(short)、インクリメントの結果にキャストを適用しますが、2 番目のケースではそうではありません。

short myShort = 1;
int resultA = myShort + myShort; // addition returns an integer
short resultB = myShort++; // returns a short, why? 

// resultB is essentially doing this
short resultB = (short)(myShort + 1);

Joel がコメントで提供したリンクに加えて、 C# 4.0 言語仕様のセクション 7.3.6.2 を参照することもできます。これは、2 進数の昇格のルールを示しています (形式の式をa = b + c;カバーしています)。また、7.6.9 をカバーしています。前置演算子と後置演算子。

于 2011-06-17T14:06:22.930 に答える
2

2つのsを追加するshortと、が返されintます。

+=++演算子の動作は異なり、期待どおりに機能します。

于 2011-06-17T14:06:54.503 に答える
1

あなたの場合のように、2 つの short、または short と int を加算した結果は常に int 型であり、val に割り当てるために short に戻す必要があります。

これがそうである理由は、2 つの short の合計、または short と int が short に収まらない可能性があるためです。したがって、常に int になります。このことを考慮;

short x = 30000;
short y = 30000;

int z = x+y; // would you really want to get a number other than 60000 here?  
short s = (short)(x+y); //if you want modulo 2^16
于 2011-06-17T14:06:18.390 に答える
0

あなたの1ラインで:

val = val +1;

int暗黙的にであるため、の結果はval + 1ですint。その値にshortを割り当てようとしていますが、精度が低下するリスクがあるため、暗黙的に行うことはできません。

于 2011-06-17T14:07:18.363 に答える
0

を使用val + 1すると、整数であると見なされます。

使用:

    short val = 32767;

    val = (short) (val + 1);

    Console.WriteLine(val);

動作するはずです。

于 2011-06-17T14:07:24.677 に答える
0

数値の評価はデフォルトでint(Int32)になります。

ここでのあなたのケースでは、short(Int16)をint(Int32)型に追加しようとしています。これは正しくエラーをスローします。

于 2011-06-17T14:07:29.893 に答える
0
val = val +1;

ここで1は、はタイプintなので、ですval + 1

于 2011-06-17T14:07:57.380 に答える
0

を実行するval++と、変数に格納されている値をインクリメントするだけです。

を実行するval=val+1と、1intデフォルトでであるため、コンパイラは両方の値をと見なし、値とともにintsを返します。それから、それは、短く保存するには大きすぎるので、元に戻すことができません。intval+1valint

于 2011-06-17T14:08:04.740 に答える