18

私はコードをもっている:

static short Sum(short a, short b)
        {
            return a + b;
        }

そして、それはコンパイルされません.saynigは「int」を「short」に変換できません。今日は本当に疲れているのかもしれませんが、問題が見えません!

4

3 に答える 3

31

そして、それはコンパイルされません.saynigは「int」を「short」に変換できません。今日は本当に疲れているのかもしれませんが、問題が見えません!

それはまさに言語が定義されている方法です。整数型の + 演算子は、次のように定義されています。

static uint op +(uint x, uint y)
static int op +(int x, int y)
static ulong op +(ulong x, ulong y)
static long op +(long x, long y)

オペランドは必要に応じてプロモートされます。

そのように定義されている理由については、正直言ってわかりません。私は「オーバーフローする可能性があるため」という議論を支持しませbyte + byteん。shortint + intlong

パフォーマンスに関係している可能性があるとどこかで聞いたことがありますが、確かなことは言いたくありません。(おそらく、プロセッサは通常、32 ビット整数と 64 ビット整数の整数演算のみを提供しますか?)

いずれにせよ、なぜそうなるかは問題ではありません- それは単に言語の規則です。

複合代入演算子には、関連する型への暗黙的な変換があるため、次のように記述できることに注意してください。

short x = 10;
short y = 20;
x += y;
于 2012-08-07T20:29:34.853 に答える
7

2 つのショートを一緒に追加すると、ショートの許容値を超えて合計できますが、int. これは、エリック・リッパートが彼の答えで言っていることです


int余談: を返す2 つの s を追加する場合に、そうでないのはなぜlongですか? エリックはそれについても次のように述べています。

整数演算がラップアラウンドする世界では、通常の計算がオーバーフローしないように十分な範囲を持つ可能性が高い型である int ですべての計算を行う方がはるかに賢明です。


そのため、+2 つの s の加算で定義された演算子は をshort返しますint

これが、コンパイル時エラーが発生する理由です-戻り値の型intを指定している場所を返していますshort`。

加算の結果が常に次のようになることがわかっshortている場合は、結果を明示的にキャストできます。short

static short Sum(short a, short b)
{
    return (short)(a + b);
}
于 2012-08-07T20:27:08.890 に答える
1

Jon Skeet は、コードが機能しない理由を詳細に説明しましたが、コンパイルするために何をする必要があるかをリストしていません。以下を使用できます。

static short Sum(short a, short b)
{
    return (short)(a + b);
}
于 2012-08-07T20:33:15.020 に答える