次のルールに従って、表現内のオペランドはより大きなタイプに宣伝されていますか?
-
28-09-2019 - |
質問
数値式に異なる数値タイプのオペランド(定数と変数)が含まれている場合、次のルールに従ってより大きなタイプに促進されるオペランドです。
- オペランドにタイプがある場合
byte
,sbyte
,char
,short
,ushort
, 、彼らは変換されますint
タイプ - オペランドの1つがある場合
int
, 、その後、すべてのオペランドが変換されますint
- 式にもタイプの手術が含まれている場合
uint
とint
, 、その後、すべてのオペランドが変換されますlong
- オペランドの1つがある場合
long
, 、その後、すべてのオペランドが変換されますlong
- 式にタイプのオペランドが含まれている場合
ulong
とlong
, 、その後、オペランドが変換されますfloat
- オペランドの1つがある場合
float
, 、その後、すべてのオペランドが変換されますfloat
- オペランドの1つがある場合
double
, 、その後、すべてのオペランドが変換されますdouble
数値式にさまざまなタイプのオペランドが含まれていると仮定すると、すべてのオペランドは最初に単一の数値タイプに変換されますが、その後、ランタイムは結果を計算しようとしますか?たとえば、変数の場合 b1
と b2
ofです byte
タイプ、while i1
ofです int
タイプ、ウィル b1
およびB2 get
コンピューティングの前にintに変換されました (b1+b2)
:
int i2=(b1+b2)+i1
解決
括弧はよりも優先されます +
, 、したがって、変換は通常後に行われます b1
と b2
追加されました。しかし +
オペレーター 過負荷はありません にとって byte
S、だから byte
Sは最初に昇格する必要があります int
s。
参考文献:
他のヒント
あなたのルールには真実の要素がいくつかありますが、技術的には不正確です。
これが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
バイナリ演算子用 +
.
所属していません StackOverflow