Почему результат вычитания параметра 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 битами очень быстро. Можно автоматически выполнить преобразование обратно из результата в байт, но это приведет к снижению производительности в том случае, если вы на самом деле не хотите такого поведения.
- Джон Скитс
Наслаждаться,
Роберт К. Картейно