Оперики внутри выражения, способствуют более широким типам в соответствии со следующими правилами?

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

Вопрос

Если числовое выражение содержит операнды (константы и переменные) разных числовых типов, являются операндами, способствующие большим типам в соответствии со следующими правилами:

  1. Если операнды имеют типы byte, sbyte, char, short, ushort, они превращаются в int тип
  2. Если один из операндов int, тогда все операнды преобразуются в int
  3. Если выражение также содержит операнды типов uint и int, тогда все операнды преобразуются в long
  4. Если один из операндов long, тогда все операнды преобразуются в long
  5. Если выражение содержит операнды типа ulong и long, тогда операнды преобразуются в float
  6. Если один из операндов float, тогда все операнды преобразуются в float
  7. Если один из операндов double, тогда все операнды преобразуются в double

Предполагая, что числовые выражения содержит операнды разных типов, будут ли все операнды сначала преобразованы в один числовой тип, и только тогда выполнение времени выполняется попытка вычислить результат? Например, если переменные b1 и b2 являются из byte Тип, пока i1 имеет int Тип, будет b1 и B2 get преобразован в int до вычисления (b1+b2):

int i2=(b1+b2)+i1
Это было полезно?

Решение

Скобки имеют более высокий приоритет, чем +, поэтому преобразование обычно происходит после b1 и b2 были добавлены. Однако + оператор не имеет перегрузки за byteS, так что bytes должен сначала продвигаться до 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 Для двоичного оператора +.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top