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

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

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

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

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

5 ответов

Решение

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

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

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

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

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

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

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

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

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

short a = 2, b = 3;

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

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

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

PS Да, и статья "a" для слов, произношение которых начинается с согласного, и "an" для слов, чья форма начинается с гласной. Номер, инт.;)

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

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

(2) байт + байт = int… почему?

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

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

Например, используя 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;

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

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

Допустим, вы делаете что-то вроде этого.

Short result = Short.MaxValue + Short.MaxValue; 

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

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

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

short - short = int

... широко обсуждается в этом вопросе Stackru: [ссылка] byte + byte = int… почему?

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

Вот ответ с самым высоким рейтингом:

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

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

- Джон Скитс

Наслаждаться,

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

Другие вопросы по тегам