Если числовое выражение содержит операнды (константы и переменные) различных числовых типов, операнды, продвинутые на большие типы согласно следующим правилам:
byte
, sbyte
, char
, short
, ushort
, они преобразовываются в int
ввестиint
, затем все операнды преобразовываются в int
uint
и int
, затем все операнды преобразовываются в long
long
, затем все операнды преобразовываются в long
ulong
и long
, затем операнды преобразовываются в float
float
, затем все операнды преобразовываются в float
double
, затем все операнды преобразовываются в double
Принятие числовых выражений содержит операнды различных типов, все операнды будут сначала преобразованы в единственный числовой тип, и только затем время выполнения попытается вычислить результат? Например, если переменные b1
и b2
имеют byte
введите, в то время как i1
имеет int
введите, будет b1
и b2 get
преобразованный в интервал до вычислений (b1+b2)
:
int i2=(b1+b2)+i1
Скобки имеют более высокий приоритет, чем +
, поэтому преобразование обычно происходит после добавления b1
и b2
. Однако оператор +
не имеет перегрузки для байта
с, поэтому байт
сначала должен быть повышен до int
с.
Дополнительная литература:
В ваших правилах есть некоторые элементы истины, но они технически неточны.
Вот соответствующие выдержки из Спецификации языка C #
7.2.6.2 Повышение уровня двоичных чисел
Повышение уровня двоичных чисел происходит для операндов предопределенных
+
,-
,*
,/
,%
,и
,|
,^
,==
,! =
,>
,<
,> =
и<=
] бинарные операторы. Двоичное числовое продвижение неявно преобразует оба операнда в общий тип, который в случае нереляционных операторов также становится типом результата операции. Двоичное числовое продвижение состоит из применения следующих правил в том порядке, в котором они здесь указаны:
- Если один из операндов имеет тип
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
В соответствии с приведенной выше спецификацией, да, байт b1, b2
подлежат преобразованию двоичных чисел в int
для бинарный оператор +
.