Почему результат вычитания параметра Int16 из переменной Int16 Int32?

Возможный дубликат:
byte + byte = int… why?

У меня есть такой способ:

 void Method(short parameter)
 {
     short localVariable = 0;
     var result = localVariable - parameter;
 }

Почему результат Int32 вместо Int16?

Ответ 1

Это не просто вычитание, просто не выполняется короткая (или байтовая/сбайтовая) арифметика.

short a = 2, b = 3;
short c = a + b;

Дает ошибку, что он не может преобразовать int (a + b) в short (c).

Еще одна причина почти никогда не использовать короткий.

Дополнительно: при любом расчете короткие и sbyte всегда будут "расширены" до int, ushort и byte to uint. Такое поведение восходит к K & R C (и probaly даже старше этого).

По этой причине (старой) причиной были проблемы с afaik, эффективностью и переполнением при работе с char. Эта последняя причина не так сильна для С#, где char - 16 бит и неявно конвертируемая в int. Но очень повезло, что числовые выражения С# по-прежнему совместимы с C и С++ в очень высокой степени.

Ответ 2

Все операции с целыми числами, меньшими, чем Int32, расширяются до 32 бит перед вычислением по умолчанию. Причина, по которой результатом является Int32, - просто оставить его так же, как и после вычисления. Если вы проверите арифметические коды операций MSIL, единственным интегральным числовым типом, с которым они работают, являются Int32 и Int64. Это "по дизайну".

Если вы хотите, чтобы результат возвращался в формат Int16, это не имеет значения, если вы выполняете бросок в коде, или компилятор (гипотетично) испускает преобразование "под капотом".

Кроме того, приведенный выше пример можно легко решить с помощью литого

short a = 2, b = 3;

short c = (short) (a + b);

Два числа будут расширяться до 32 бит, будут вычтены, а затем усечены до 16 бит, что и предполагалось MS.

Преимущество использования коротких (или байтов) - это, прежде всего, хранение в случаях, когда у вас имеется огромное количество данных (графические данные, потоковая передача и т.д.).

P.S. О, и статья "a" для слов, произношение которых начинается с согласного, и "an" для слов, произносимая форма начинается с гласного. Число, AN int.;)

Ответ 3

Другие ответы, приведенные в этом потоке, а также приведенные здесь обсуждения являются поучительными:

(1) Почему для вычитания байта в С# требуется листинг?

(2) byte + byte = int... почему?

(3) Почему для вычитания байта в С# требуется бросок?

Но просто чтобы влить в него еще одну морщину, это может зависеть от того, какие операторы вы используете. Операторы increment (++) и decment (-), а также операции присваивания присваивания (+ =) и присваивания вычитания (- =) перегружены для множества числовых типов, и они выполняют дополнительный шаг преобразования результата Вернитесь к типу операнда при возврате результата.

Например, используя short:

short s = 0;

s++;                // <-- Ok
s += 1;             // <-- Ok
s = s + 1;          // <-- Compile time error!
s = s + s;          // <-- Compile time error!

Использование байта:

byte b = 0;

b++;                // <-- Ok
b += 1;             // <-- Ok
b = b + 1;          // <-- Compile time error!
b = b + b;          // <-- Compile time error!

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

short s
s += (short)1;

Во всяком случае, еще один аспект для всего этого обсуждения...

Ответ 4

Я думаю, что это сделано автоматически, чтобы избежать переполнения,

позволяет сказать, что вы делаете что-то вроде этого.

Short result = Short.MaxValue + Short.MaxValue; 

Результат явно не вписывался бы в короткий.

одна вещь, которую я не понимаю, тогда почему бы не сделать это для int32 тоже, который автоматически преобразуется в long???

Ответ 5

Эффект, который вы видите...

short - short = int

... подробно обсуждается в этом вопросе Stackoverflow: [link] byte + byte = int... почему?

Существует много хорошей информации и некоторых интересных обсуждений, почему это так.

Вот ответ "сверху":

Я считаю это в основном ради производительности. (В терминах "почему это вообще происходит", потому что там не являются операторами, определенными С# для арифметика с байтом, сбайтом, коротким или насчет, как и другие. Эта ответ о том, почему эти операторы не определены.)

Процессоры имеют собственные операции с сделать арифметику с 32 битами очень быстро. Выполнение преобразования обратно от результата до байта автоматически можно было бы сделать, но приводят к штрафам за исполнение в случай, когда вы действительно не хотите это поведение.

- Джон Скитс

Enjoy,

Роберт К. Картайно