0

次のことを考慮してください

public byte GetAByte()
{
    return (byte)(_globalByte % 13);
}

以下は機能せず、エラーがスローされることに注意してください。

    return (_globalByte % (byte)13);

ここで、mod 演算子は整数を返します。これは、return ステートメントが機能するためにバイトにキャストし直す必要があります。私が間違っている場合は修正してください。ただし、モジュラスが計算される前に _globalByte が整数にキャストされると推測しています。これは、合計で 2 回の鋳造操作を意味します。

だから私の質問は、なぜ基本的な演算子は毎回整数を返さなければならないのですか? これは Java に固有の癖ですか、それともこの方法で実行することの重要性はありますか?

4

2 に答える 2

5

だから私の質問は、なぜ基本的な演算子は毎回整数を返さなければならないのですか? これは Java に固有の癖ですか、それともこの方法で実行することの重要性はありますか?

これが発生する理由は、Java の整数算術演算子がint op int -> int(またはlong op long -> long) として定義されているためです。

なぜ彼らはそれをそのように定義したのですか?よくわかりませんが、3つの可能な説明を考えることができます:

  • さまざまなネイティブ命令セット / アーキテクチャでの効率的な実装。
  • C や C++ などの他の言語との一貫性。(私はこれらの言語の標準の専門家ではありませんが、C99 言語仕様でこの場所を見つけました ... セクション 6.3.1.1 パラ 2.)
  • 数学的一貫性。

IMO、後者はおそらく最も重要です。

+with signatureのオーバーロードがあったとしますbyte op byte -> byte+これで、が関連付けられなくなった状況になりました。私たちが持っていると仮定しbyte b1, b2; int i;ます

  • (b1 + b2) + i最初に演算子+を使用して実行し、次に演算子を使用しbyteて 2 番目を実行します。+int

  • b1 + (b2 + i)演算子+を使用して 2 番目を実行し、次に演算子を使用して 1 番目を実行します。int+int

b1 + b2バイト単位のオーバーフローの場合、複合式を評価する 2 つの異なる方法により、異なる答えが得られることに注意してください。

ただし、オペランドを自動的に拡張しintて操作を実行すると、int op int -> intこれが回避されます。

于 2013-09-22T06:04:51.937 に答える
0

起こっていることは、「暗黙の拡大変換」と呼ばれます。

2 つの型に対して操作が行われると、下位の型が上位の型に暗黙的に変換されます。したがって、演算子を使用して値 13_globalByteで操作しようとすると、暗黙的な変換を使用して int に変換されます。intmodulus

于 2013-09-22T05:19:32.797 に答える