Кому-то с будуна пришло в голову что это будет источником ошибок при вычитании чисел. Учитывая что в любом ЯП можно сделать фейл соразмерный премии Дарвина в тысяче непредсказуемых мест - этот пункт кажется странным. Теперь жалеют, но стесняются признать ошибку.
Правило: если чего-то нету в Java - это не нужно. Если это появляется в Java - значит нужно и ты никогда и не утверждал обратного. Беззнаковых в Java нету. Не нужно
Кстати, я ещё не сталкивался с проблемами, связанными с этим. Разве что, на олимпиадных задачках - в с++ хватало unsigned long, в джаве приходилось использовать длинную арифметику.
Привык, видимо. А битовые операции и на знаковых типах нормально идут.
Пусть лучше проект будет кушать на два мегабайта больше, чем если бы он достиг такого состояния, когда покорить Эверест гораздо проще, чем зафиксить не сложный на первый взгляд баг.
как организовать массив в 200 элементов ( значения элементов 0..220 ) с помощью типа byte?
byte[] arr = new byte[200];
Считать от -128 ;)?
Ты понимаешь, что в компьютере всё представляется в битах и твои "-128" это не более, чем одно из текстовых представлений определённого сочетания битов? Приведи пример кода, который ты хочешь сделать с этим массивом, попробую показать, как это будет выглядеть.
Ещё там был забавный баг с механикой агрессии и миролюбия. Суть такова, что агрессивность цивилизации измерялась по шкале от 1 до 10. Девятки и десятки были у всяких Чингисханов, Монтесум и Сталиных, а у духовного пацифиста Махатмы Ганди была единичка. И ещё были модификаторы — строй «республика» уменьшает агрессивность на 1, «демократия» — на 2. Соответственно, сразу же, как только индусы открывали Демократию, у Ганди становилась агрессивность −1.
А теперь внимание, самая писечка. Эта переменная была однобайтная и строго неотрицательная, от 0 до 255. Соответственно, агрессивность Махатмы Ганди становилась равна 255 из 10. Поэтому, построив у себя демократию, Ганди двигался рассудком, клепал ядрёные бомбы и умножал всех на ноль.
А если б миролюбие кодировали знаковым числом - все сложилось бы иначе.
Просто у меня возник вопрос «почему?». Если я хочу оперировать массивом беззнаковых элементов до 220, то логичней использовать один байт на элемент(для JVM, 36-и битное представление байта для других архитектур не рассматриваем), так?
организовать массив в 200 элементов типа byte с помощью типа byte
byte[] arr = new byte[Byte.toUnsignedInt(i)];
не, не понимаю
Грубо говоря - 0..127 signed соответствуют 0..127 unsigned. -128 signed соответствует 128 unsigned. -127 signed соответствует 129 unsigned и т.д.
Просто у меня возник вопрос «почему?». Если я хочу оперировать массивом беззнаковых элементов до 220, то логичней использовать один байт на элемент(для JVM, 36-и битное представление байта для других архитектур не рассматриваем), так?
Так. Оперируй, используй. Проблем не будет.
Даже вопрос в другом: с каких соображений (критериев) в Java отсутствуют беззнаковые типы? Безопасность?
Лыко-мочало, начинаем сначала. С каких соображений по умолчанию в Java целочисленные типы трактуются как signed? Видимо потому, что в подавляющем большинстве случаев нужны именно signed типы. Для unsigned операций в стандартной библиотеке есть все нужные функции.
Всё отличие между signed и unsigned byte/short/int/long это операции toString, fromString, •, / и преобразования между типами разной размерности. По умолчанию в Java они действительно считаются, как signed. Но есть набор функций для каждого примитивного типа, который позволяет их трактовать, как unsigned.
На уровне компьютера signed и unsigned byte это одни и те же 8 битов.
Скажу немного по-другому. В подавляющем большинстве случаев дополнительные значения, которые даёт unsigned тип не нужны, даже если значение по сути не может принимать отрицательные значения.
Например то, как signed/unsigned реализовано в C/C++ вносит много багов и излишних размышлений при взаимодействии этих типов. Вариант Java мне нравится больше. Там, где это надо (из соображения потребления памяти), можно использовать unsigned. Там, где это не критично, будет signed, проблем это не создаёт.
а что в случае агрессивности значит «минус»? Как с ним дальше работать? К примеру царь захватил заложников. выкупить заложников у уаря стоит: s=1000*r, где r - агрессия, к примеру -1. Имеем -1000 для мирного царя:) Т.е Царь нам заплатит еще за наших заложников?
Прерывание тем и хорошо, что позволяет не проверять переполнение после каждой операции. Проверить переполнение можно и без флажка, только это гробит производительность.
смысл агрессии в том, что она ранжируется 0...100%
Наивный, вы ещё скажите что она больше 100% быть не может. А уж как в реальности строго положительные параметры становятся ниже нуля и говорить не стоит. Отсутствие беззнаковых типов тем и хорошо, что не позволяет ради экономии пары байт нажить себе геморрой, когда реальность расходится с твоим представлением о ней.
ну, смотри. У нас есть школа(-ы), и есть задача разместить в каждом классе этой(-их) школы стулья. В школе 129 кабинетов и известно, что в каждый кабинет вмещается до 220 стульев. Необходимо написать программу для учета стульев в каждом классе, иметь возможность редактировать количество стульев в каждом классе каждой школы. Какой тип данных рациональней использовать для решения это задачи?
Какой тип данных рациональней использовать для решения это задачи?
1. Набросайте свою модель данных
2. Посчитайте выгоду от использования тут беззнакового типа
3. Подумайте о том, сколько вам потребуется переписать если понадобится доработка, где необходимо будет учесть дефицит стульев (например это может сильно упростить расчёты / перестановку стульев из кабинета в кабинет)
4. Сравните выгоду из п2 и потери из п3.