Действительно ли операнды внутри являются выражением, способствовавшим на большие типы согласно следующим правилам?

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

  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 преобразованный в интервал до вычислений (b1+b2):

int i2=(b1+b2)+i1
6
задан polygenelubricants 21 June 2010 в 14:30
поделиться

2 ответа

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

Дополнительная литература:

1
ответ дан 17 December 2019 в 20:28
поделиться

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

Вот соответствующие выдержки из Спецификации языка 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 для бинарный оператор + .

1
ответ дан 17 December 2019 в 20:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: