次のルールに従って、表現内のオペランドはより大きなタイプに宣伝されていますか?

StackOverflow https://stackoverflow.com/questions/3080597

質問

数値式に異なる数値タイプのオペランド(定数と変数)が含まれている場合、次のルールに従ってより大きなタイプに促進されるオペランドです。

  1. オペランドにタイプがある場合 byte, sbyte, char, short, ushort, 、彼らは変換されます int タイプ
  2. オペランドの1つがある場合 int, 、その後、すべてのオペランドが変換されます int
  3. 式にもタイプの手術が含まれている場合 uintint, 、その後、すべてのオペランドが変換されます long
  4. オペランドの1つがある場合 long, 、その後、すべてのオペランドが変換されます long
  5. 式にタイプのオペランドが含まれている場合 ulonglong, 、その後、オペランドが変換されます float
  6. オペランドの1つがある場合 float, 、その後、すべてのオペランドが変換されます float
  7. オペランドの1つがある場合 double, 、その後、すべてのオペランドが変換されます double

数値式にさまざまなタイプのオペランドが含まれていると仮定すると、すべてのオペランドは最初に単一の数値タイプに変換されますが、その後、ランタイムは結果を計算しようとしますか?たとえば、変数の場合 b1b2 ofです byte タイプ、while i1 ofです int タイプ、ウィル b1 およびB2 get コンピューティングの前にintに変換されました (b1+b2):

int i2=(b1+b2)+i1
役に立ちましたか?

解決

括弧はよりも優先されます +, 、したがって、変換は通常後に行われます b1b2 追加されました。しかし + オペレーター 過負荷はありません にとって byteS、だから byteSは最初に昇格する必要があります ints。

参考文献:

他のヒント

あなたのルールには真実の要素がいくつかありますが、技術的には不正確です。

これがC#言語仕様からの関連する抜粋です

7.2.6.2バイナリ数値プロモーション

事前定義されたオペランドに対してバイナリ数値プロモーションが発生します +, , *, /, %, &, |, ^, ==, !=, >, <, >=, 、 と <= バイナリ演算子。バイナリ数値プロモーションは、両方のオペランドを共通のタイプに暗黙的に変換します。これは、非関係演算子の場合、操作の結果タイプにもなります。バイナリ数値プロモーションは、次のルールを適用することで構成されています。

  • いずれかのオペランドがタイプの場合 decimal, 、他のオペランドはタイプに変換されます decimal, 、または他のオペランドがタイプの場合、コンパイル時間エラーが発生します float また double.
  • それ以外の場合、どちらのオペランドがタイプの場合 double, 、他のオペランドはタイプに変換されます double.
  • それ以外の場合、どちらのオペランドがタイプの場合 float, 、他のオペランドはタイプに変換されます float.
  • それ以外の場合、どちらのオペランドがタイプの場合 ulong, 、他のオペランドはタイプに変換されます ulong, 、または他のオペランドがタイプの場合、コンパイル時間エラーが発生します sbyte, short, int, 、 また long.
  • それ以外の場合、どちらのオペランドがタイプの場合 long, 、他のオペランドはタイプに変換されます long.
  • それ以外の場合、どちらのオペランドがタイプの場合 uint また、他のオペランドはタイプです sbyte, short, 、 また int, 、両方のオペランドがタイプに変換されます long.
  • それ以外の場合、どちらのオペランドがタイプの場合 uint, 、他のオペランドはタイプに変換されます uint.
  • それ以外の場合、両方のオペランドがタイプに変換されます int.

int i2=(b1+b2)+i1

上記の仕様に従って、はい、 byte b1, b2 バイナリ数値プロモーションの対象となります int バイナリ演算子用 +.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top