Операнды внутри выражения повышаются до более крупных типов в соответствии со следующими правилами? - PullRequest
6 голосов
/ 20 июня 2010

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

  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

Ответы [ 2 ]

1 голос
/ 20 июня 2010

Скобки имеют более высокий приоритет, чем +, поэтому преобразование обычно происходит после добавления b1 и b2. Тем не менее, оператор + не имеет перегрузки в течение byte с, поэтому byte с необходимо сначала повысить до int с.

Дальнейшее чтение:

1 голос
/ 20 июня 2010

Ваши правила содержат некоторые элементы истин, но технически неточны.

Вот соответствующие выдержки из спецификации языка C #

7.2.6.2 Двоичные числовые акции

Двоичное числовое продвижение происходит для операндов предопределенных +, , *, /, %, &, |, ^, ==, * Бинарные операторы 1019 *, >, <, >= и <=. Двоичное числовое продвижение неявно преобразует оба операнда в общий тип, который, в случае нереляционных операторов, также становится типом результата операции. Двоичное числовое продвижение состоит из применения следующих правил, в порядке их появления здесь:

  • Если один из операндов имеет тип 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 для двоичного оператора +.

...