Реализован ли тип Char для типа UInt16 в .NET под капотом? - PullRequest
0 голосов
/ 04 октября 2019

Типы реализованы одинаково? Это кажется странным с точки зрения «безопасности типов». Что на самом деле здесь происходит?

Я столкнулся с этим сценарием, когда в своем коде я смог сделать то, что показано с помощью переменной "b". Играя с разными типами, я вроде понимаю, что происходит, но мне любопытно, как это происходит под капотом.

Char a2 = '0';
UInt16 a = a2;
// Int16 a = '2'; // Compile time error
Int32 b = '1';
Int64 c = '2';

Ответы [ 2 ]

3 голосов
/ 04 октября 2019

Они не определены в терминах друг друга, но преобразования от одного к другому определены . См. MSDN: Таблица преобразований типов C #

Неявное преобразование типов определяется из типа данных char в:

  • ushort (псевдоним UInt16)
  • int
  • uint
  • long
  • ulong
  • float
  • double
  • decimal

Не определен неявный диалог типов с short, поскольку такое преобразование приведет к потере точности. char определяется в C # как «16-битный символ Unicode». Использование бита для обозначения знака может привести к возможной потере точности.

См. Также сообщение в блоге Эрика Липперта, Почему символ неявно преобразуется в ushort, а не наоборот

1 голос
/ 04 октября 2019

UInt16 = ushort = char = 0..65535 = 2 байта без знака = 16 бит

Таким образом, вы можете поместить символ в UInt16, который является ushort.

Int16 = short! =char = -32768..32767 = 2 байта со знаком = 15 бит + 1 знак

Таким образом, без использования правильного приведения или преобразования вы не можете поместить символ в Int16, потому что недостаточно двоичного пространства для размещения 16 битв 15 битах.

Это похоже на попытку залить 1 литр воды в чашку чая: вы получаете переполнение.

Поведение по умолчанию в C # состоит в том, что не выкидывает событие, когдапереполнение.

Для этого есть ключевое слово checked.

Здесь компилятор не позволяет вам назначить символ для Int16, потому что он точно знает, что вы пытаетесь сделать, и отказываетсясделайте это.

Изучите основы переменных типов данных C #

Без знака и со знаком

Поведение смещениядля целых чисел со знаком

Учебник по представлению данных

Целочисленное переполнение

Двоичное переполнение

...