Вопрос

В чем смысл использования чисел со знаком в качестве индексов в .Net?

В Python вы можете индексировать массив с конца, отправляя отрицательные числа, но в .Net это не так..Net будет нелегко добавить такую ​​функцию позже, поскольку она может нарушить работу другого кода, возможно, используя специальные правила (да, плохая идея, но я думаю, что такое случается) при индексировании.

Не то чтобы мне когда-либо приходилось индексировать массивы размером более 2 147 483 647, но я действительно не могу понять, почему они выбирают числа со знаком.

Может быть, потому, что более нормально использовать в коде числа со знаком?

Редактировать:Я только что нашел эти ссылки:

Опасности беззнаковой итерации в C/C++

Длина знаковых слов и индексы

Редактировать2:Хорошо, еще пара веских причин из темы, которую опубликовал Мэтью Флашен:

  • Исторические причины, поскольку это c-подобный язык.
  • Взаимодействие с c
Это было полезно?

Решение

Для простоты конечно.Тебе нравится беда выполняет арифметику размера с беззнаковыми целыми числами?

Другие советы

Возможно, это связано с давней традицией использования значения ниже 0 в качестве недопустимого индекса.Такие методы, как String.IndexOf, возвращают -1, если элемент не найден.Поэтому возвращаемое значение должно быть подписано.Если потребителям индекса потребуются беззнаковые значения, вам придется а) проверить и б) привести значение, чтобы использовать его.Для подписанных индексов вам просто нужна проверка.

Unsigned не совместим с CLS.

Основная польза беззнаковых чисел возникает при составлении больших чисел из меньших и наоборот.Например, если кто-то получает четыре беззнаковых байта из соединения и желает рассматривать их значение в целом как 32-битное целое число, использование беззнаковых типов означает, что можно просто сказать:

  value = byte0 | (byte1*256) | (byte2*65536) | (byte3*16777216);

Напротив, если бы байты были подписаны, выражение, подобное приведенному выше, было бы более сложным.

Я не уверен, что действительно вижу какую-либо причину для того, чтобы язык, разработанный в настоящее время, не включал беззнаковые версии всех типов, короче, чем самый длинный целочисленный тип со знаком, с семантикой, согласно которой все целые числа (имеются в виду дискретно-количественные числа, а не какой-либо конкретный тип) ) по умолчанию будут выполняться операции, которые полностью соответствуют наибольшему знаковому типу. как будто они действовали по этому типу.Включение беззнаковой версии наибольшего знакового типа усложнило бы спецификацию языка (поскольку пришлось бы указывать, какие операции должны находиться в пределах диапазона знакового типа, а какие операции должны находиться в пределах диапазона беззнакового типа), но в противном случае должно быть нет проблем разработать язык так, чтобы if (unsigned1 - unsigned2 > unsigned3) даст «численно правильный» результат, даже если unsigned2 больше, чем unsigned1 [если кто-то хочет беззнакового переноса, можно явно указать if ((Uint32)(unsigned1 - unsigned2) > unsigned3)].Язык, определяющий такое поведение, безусловно, стал бы большим улучшением по сравнению с беспорядком, существующим в C (оправданным, учитывая его историю), C# или vb.net.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top