Возможный дубликат:
byte + byte = int… why?
У меня есть такой способ:
void Method(short parameter)
{
short localVariable = 0;
var result = localVariable - parameter;
}
Почему результат Int32
вместо Int16
?
Возможный дубликат:
byte + byte = int… why?
У меня есть такой способ:
void Method(short parameter)
{
short localVariable = 0;
var result = localVariable - parameter;
}
Почему результат Int32
вместо Int16
?
Это не просто вычитание, просто не выполняется короткая (или байтовая/сбайтовая) арифметика.
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 и С++ в очень высокой степени.
Все операции с целыми числами, меньшими, чем 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.;)
Другие ответы, приведенные в этом потоке, а также приведенные здесь обсуждения являются поучительными:
(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;
Во всяком случае, еще один аспект для всего этого обсуждения...
Я думаю, что это сделано автоматически, чтобы избежать переполнения,
позволяет сказать, что вы делаете что-то вроде этого.
Short result = Short.MaxValue + Short.MaxValue;
Результат явно не вписывался бы в короткий.
одна вещь, которую я не понимаю, тогда почему бы не сделать это для int32 тоже, который автоматически преобразуется в long???
Эффект, который вы видите...
short - short = int
... подробно обсуждается в этом вопросе Stackoverflow: [link] byte + byte = int... почему?
Существует много хорошей информации и некоторых интересных обсуждений, почему это так.
Вот ответ "сверху":
Я считаю это в основном ради производительности. (В терминах "почему это вообще происходит", потому что там не являются операторами, определенными С# для арифметика с байтом, сбайтом, коротким или насчет, как и другие. Эта ответ о том, почему эти операторы не определены.)
Процессоры имеют собственные операции с сделать арифметику с 32 битами очень быстро. Выполнение преобразования обратно от результата до байта автоматически можно было бы сделать, но приводят к штрафам за исполнение в случай, когда вы действительно не хотите это поведение.
- Джон Скитс
Enjoy,
Роберт К. Картайно