Я произошел из среды главным образом C/C++, прежде чем я начал использовать C#. Одна из вещей, которые я сделал со своим первым проектом в C#, была, делают класс как это
class Element{
public uint Size;
public ulong BigThing;
}
Я был затем умерщвлен тем, что это требует кастинга:
int x=MyElement.Size;
как делает
int x=5;
uint total=MyElement.Size+x;
Почему разработчики языка решали сделать целое число со знаком и типы беззнаковых целых чисел не неявно castable? И почему неподписанные типы не используются больше всюду по библиотеке .NET? Например, String.Length
никогда не может быть отрицательным, все же это - целое число со знаком.
Наряду с ответом Джона то, что число без знака не может быть отрицательным, не означает, что оно не больше числа со знаком. uint
составляет от 0 до 4 294 967 295, но int
составляет от -2 147 483 648 до 2 147 483 647. Много места выше максимума int
для потерь.
Почему разработчики языка решили не использовать знаковые и беззнаковые целочисленные типы. неявно приведенный?
Потому что это может привести к потере данных или возникновению исключения, что обычно не рекомендуется разрешать неявно. (Неявное преобразование long в double, по общему признанию, тоже может привести к потере данных, но по-другому.)
И почему беззнаковые типы больше не используются в библиотеке .Net
Беззнаковые типы несовместимы с CLS - не все языки .NET всегда поддерживали их. Например, в Visual Basic не было «встроенной» поддержки беззнаковых типов данных в .NET 1.0 и 1.1; он был добавлен в язык для 2.0. (Вы все еще можете использовать их, но они не были частью самого языка - например, вы не могли использовать обычные арифметические операторы.)
Потому что неявное преобразование беззнакового целого числа 3B в знаковое целое число приведет к взрыву.
Беззнаковое значение вдвое превышает максимальное значение подписанного. По той же причине вы не можете преобразовать long в int.
По второму пункту: потому что они хотели, чтобы CLR был совместим с языками, в которых нет беззнаковых типов данных (читай: VB.NET).
Затем я был убит тем фактом, что это требует кастинга:
int x=MyElement.Size;
Но здесь вы противоречите сами себе. Если вам действительно (очень) нужно, чтобы Size был беззнаковым, то присваивать его (знаковому) x - это ошибка. Глубокий изъян в вашем коде.
Например, String.Length никогда не может быть отрицательной, и все же это знаковое целое число
Но String.IndexOf может вернуть отрицательное число, и было бы неудобно, если бы значения String.Length и Index были разных типов.
И хотя в теории есть смысл в беззнаковой String.Length (ограничение в 4 ГБ), на практике даже текущие 2 ГБ достаточно велики (потому что строки такой длины все равно редки и неработоспособны).
Так что реальный ответ таков: Зачем вообще использовать unsigned?