Как var работает для чисел?


Сегодня я экспериментировал с тем, как компилятор определяет типы чисел, объявленных как var.

var a = 255; //Type = int. Value = byte.MaxValue. Why isn't this byte?
var b = 32767; //Type = int. Value = short.MaxValue. Why isn't this short?
var c = 2147483647; //Type = int. Value = int.MaxValue. int as expected.
var d = 2147483648; //Type = uint. Value = int.MaxValue + 1. uint is fine but could have been long?
var e = 4294967296; //Type = long. Value = uint.MaxValue + 1. Type is long as expected.

Почему int является значением по умолчанию для любого числа, находящегося между Int32.MinValue и Int32.MaxValue?

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

Если компилятор использовал наименьший тип данных и если у вас была переменная с 255 и знал, что позже вы захотите сохранить значение, подобное 300, тогда программист мог просто объявить его short вместо использования var.

Почему var d = 2147483648 неявно uint и не long?

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

1 6

1 ответ:

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

Это совершенно верно. Спецификация языка C# объясняет, что он пытается выбрать интегральный тип, который использует наименьшее возможное число байт для представления целочисленного литерала без суффикса. Вот объяснение из спецификации языка:

, чтобы наименьшие возможные значения int и long были записаны как десятичные целочисленные литералы, существуют следующие два правила:

  • Когда десятичный целочисленный литерал со значением 2147483648 и без целочисленный тип-суффикс появляется в качестве маркера сразу после унарного минус-оператора, результатом является константа типа int со значением −2147483648. Во всех других ситуациях такойдесятично-целочисленный литерал имеет тип uint.
  • Когда a десятично-целочисленно-литеральный со значением 9223372036854775808 и нет целочисленный тип-суффикс или целочисленный тип-суффикс L или l появляется как токен сразу после унарного минус-оператора токена, результатом является константа типа long со значением −9223372036854775808. Во всех других ситуациях такойдесятично-целочисленный литерал имеет тип ulong.
Обратите внимание, что спецификация языка явно упоминает ваш пример var d = ..., требуя, чтобы результат имел Тип uint.