Как работает var для чисел? - PullRequest
0 голосов
/ 21 мая 2018

Я экспериментировал сегодня с тем, как компилятор определяет типы для чисел, объявленных как 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 Ответ

0 голосов
/ 21 мая 2018

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

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

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

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

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

...