Как 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
.