Основная полезность чисел без знака возникает при составлении больших чисел из меньших и наоборот. Например, если один получает четыре неподписанных байта от соединения и хочет рассматривать их значение, взятое в целом, как 32-разрядное целое число, использование типов без знака означает, что можно просто сказать:
value = byte0 | (byte1*256) | (byte2*65536) | (byte3*16777216);
В отличие от этого, если бы байты были подписаны, выражение, подобное приведенному выше, было бы более сложным.
Я не уверен, что действительно вижу какую-либо причину для языка, разработанного в настоящее время, чтобы не включать неподписанные версии всех типов короче, чем самый длинный целочисленный тип со знаком, с семантикой, которая является целой (т.е. Любые операции определенного типа), которые будут полностью соответствовать наибольшему типу со знаком, будут по умолчанию выполняться , как если бы они работали с этим типом. Включение неподписанной версии самого большого подписанного типа усложнит языковую спецификацию (поскольку нужно будет указать, какие операции должны соответствовать диапазону подписанного типа, а какие операции должны соответствовать диапазону неподписанного типа), но в противном случае должно быть Нет проблем при разработке языка, чтобы if (unsigned1 - unsigned2 > unsigned3)
давал «численно-корректный» результат, даже если unsigned2
больше unsigned1
[если кто-то хочет получить обход без знака, можно явно указать if ((Uint32)(unsigned1 - unsigned2) > unsigned3)
]. Язык, который определяет такое поведение, безусловно, будет большим улучшением по сравнению с беспорядком, который существует в C (оправдано, учитывая его историю), C # или vb.net.