Оперики внутри выражения, способствуют более широким типам в соответствии со следующими правилами?
-
28-09-2019 - |
Вопрос
Если числовое выражение содержит операнды (константы и переменные) разных числовых типов, являются операндами, способствующие большим типам в соответствии со следующими правилами:
- Если операнды имеют типы
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
преобразован в int до вычисления (b1+b2)
:
int i2=(b1+b2)+i1
Решение
Скобки имеют более высокий приоритет, чем +
, поэтому преобразование обычно происходит после b1
и b2
были добавлены. Однако +
оператор не имеет перегрузки за byte
S, так что byte
s должен сначала продвигаться до int
с.
Дальнейшее чтение:
Другие советы
Ваши правила имеют некоторые элементы истины, но технически неточны.
Вот соответствующие выдержки из спецификации языка 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
Для двоичного оператора +
.