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