Как 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 ответов


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

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

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

  • когда decimal-integer-literal со значением 2147483648 и целое число-тип-суффикс появляется как токен сразу после унарного минус-оператора токена, результатом является константа типа int со значением −2147483648. Во всех других ситуациях такой decimal-integer-literal типа uint.
  • когда decimal-integer-literal со значением 9223372036854775808 и целое число-тип-суффикс или целое число-тип-суффикс L или l появляется как токен сразу после унарного минус токена оператора, результатом является константа типа long со значением −9223372036854775808. Во всех других ситуациях такой decimal-integer-literal типа ulong.

обратите внимание, что язык спецификация упоминает ваш var d = ... пример явно, требующий, чтобы результат был типа uint.