Как 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 ответ:
Это совершенно верно. Спецификация языка C# объясняет, что он пытается выбрать интегральный тип, который использует наименьшее возможное число байт для представления целочисленного литерала без суффикса. Вот объяснение из спецификации языка:Похоже, что компилятор всегда будет пытаться использовать 32-битное целое число, если это возможно, сначала со знаком, затем без знака, затем долго.
Обратите внимание, что спецификация языка явно упоминает ваш пример, чтобы наименьшие возможные значения
int
иlong
были записаны как десятичные целочисленные литералы, существуют следующие два правила:
- Когда десятичный целочисленный литерал со значением
2147483648
и без целочисленный тип-суффикс появляется в качестве маркера сразу после унарного минус-оператора, результатом является константа типаint
со значением−2147483648
. Во всех других ситуациях такойдесятично-целочисленный литерал имеет типuint
.- Когда a десятично-целочисленно-литеральный со значением
9223372036854775808
и нет целочисленный тип-суффикс или целочисленный тип-суффиксL
илиl
появляется как токен сразу после унарного минус-оператора токена, результатом является константа типаlong
со значением−9223372036854775808
. Во всех других ситуациях такойдесятично-целочисленный литерал имеет типulong
.var d = ...
, требуя, чтобы результат имел Типuint
.