LINUX.ORG.RU

Кому-то с будуна пришло в голову что это будет источником ошибок при вычитании чисел. Учитывая что в любом ЯП можно сделать фейл соразмерный премии Дарвина в тысяче непредсказуемых мест - этот пункт кажется странным. Теперь жалеют, но стесняются признать ошибку.

Правило: если чего-то нету в Java - это не нужно. Если это появляется в Java - значит нужно и ты никогда и не утверждал обратного. Беззнаковых в Java нету. Не нужно

vertexua ★★★★☆ ()
Последнее исправление: vertexua (всего исправлений: 2)

Кстати, я ещё не сталкивался с проблемами, связанными с этим. Разве что, на олимпиадных задачках - в с++ хватало unsigned long, в джаве приходилось использовать длинную арифметику.
Привык, видимо. А битовые операции и на знаковых типах нормально идут.

GblGbl ★★★★★ ()
Ответ на: комментарий от GblGbl

проблема, IMHO, в нерациональности тспользования памяти. хотя, при той концепции «безопасности», избыточности это как маленькая соринка.

int13h ★★★★★ ()
Ответ на: комментарий от int13h

Пусть лучше проект будет кушать на два мегабайта больше, чем если бы он достиг такого состояния, когда покорить Эверест гораздо проще, чем зафиксить не сложный на первый взгляд баг.

slyjoeh ★★★ ()
Ответ на: комментарий от int13h

как организовать массив в 200 элементов ( значения элементов 0..220 ) с помощью типа byte?

byte[] arr = new byte[200];

Считать от -128 ;)?

Ты понимаешь, что в компьютере всё представляется в битах и твои "-128" это не более, чем одно из текстовых представлений определённого сочетания битов? Приведи пример кода, который ты хочешь сделать с этим массивом, попробую показать, как это будет выглядеть.

Legioner ★★★★★ ()
Ответ на: комментарий от int13h

Про безумного Ганди в «Цивилизации» слышал?

Ещё там был забавный баг с механикой агрессии и миролюбия. Суть такова, что агрессивность цивилизации измерялась по шкале от 1 до 10. Девятки и десятки были у всяких Чингисханов, Монтесум и Сталиных, а у духовного пацифиста Махатмы Ганди была единичка. И ещё были модификаторы — строй «республика» уменьшает агрессивность на 1, «демократия» — на 2. Соответственно, сразу же, как только индусы открывали Демократию, у Ганди становилась агрессивность −1.

А теперь внимание, самая писечка. Эта переменная была однобайтная и строго неотрицательная, от 0 до 255. Соответственно, агрессивность Махатмы Ганди становилась равна 255 из 10. Поэтому, построив у себя демократию, Ганди двигался рассудком, клепал ядрёные бомбы и умножал всех на ноль.

А если б миролюбие кодировали знаковым числом - все сложилось бы иначе.

LongLiveUbuntu ★★★★★ ()
Последнее исправление: LongLiveUbuntu (всего исправлений: 1)
Ответ на: комментарий от Legioner

byte[] arr = new byte[200]; Я же попросил организовать массив в 200 элементов типа byte с помощью типа byte, к примеру:

byte i; 
...
byte[] arr = new byte[i]; 

Ты понимаешь, что в компьютере всё представляется в битах и твои "-128"

Считать от -128 ;)

не, не понимаю

int13h ★★★★★ ()
Ответ на: комментарий от Legioner

Просто у меня возник вопрос «почему?». Если я хочу оперировать массивом беззнаковых элементов до 220, то логичней использовать один байт на элемент(для JVM, 36-и битное представление байта для других архитектур не рассматриваем), так?

int13h ★★★★★ ()
Ответ на: комментарий от Legioner

Даже вопрос в другом: с каких соображений (критериев) в Java отсутствуют беззнаковые типы? Безопасность?

int13h ★★★★★ ()
Ответ на: комментарий от int13h

организовать массив в 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 битов.

Legioner ★★★★★ ()
Последнее исправление: Legioner (всего исправлений: 3)
Ответ на: комментарий от vertexua

просто мужикам нравится делить Int.MIN_VALUE на -1 и получать предсказуемый результат.

anonymous ()
Ответ на: комментарий от int13h

твое мнение мало клму интересно с учетом того, что ты новый анонімус

anonymous ()
Ответ на: комментарий от int13h

Не соглашусь.

Скажу немного по-другому. В подавляющем большинстве случаев дополнительные значения, которые даёт unsigned тип не нужны, даже если значение по сути не может принимать отрицательные значения.

Например то, как signed/unsigned реализовано в C/C++ вносит много багов и излишних размышлений при взаимодействии этих типов. Вариант Java мне нравится больше. Там, где это надо (из соображения потребления памяти), можно использовать unsigned. Там, где это не критично, будет signed, проблем это не создаёт.

Legioner ★★★★★ ()
Ответ на: комментарий от int13h

В случае знакового целого оно бы просто ушло в минуса как и положено.

Целочисленное переполнение вообще не проверяется, если ты не знал.

LongLiveUbuntu ★★★★★ ()

В 8-ке добавили API для беззнаковых целых

maxcom ★★★★★ ()
Ответ на: комментарий от LongLiveUbuntu

Было бы еще хуже небось, а так даже очень реалистично вышло, похоже на некоторые страны в реальности.

Deleted ()
Ответ на: комментарий от LongLiveUbuntu

а что в случае агрессивности значит «минус»? Как с ним дальше работать? К примеру царь захватил заложников. выкупить заложников у уаря стоит: s=1000*r, где r - агрессия, к примеру -1. Имеем -1000 для мирного царя:) Т.е Царь нам заплатит еще за наших заложников?

int13h ★★★★★ ()
Ответ на: комментарий от LongLiveUbuntu

смысл агрессии в том, что она ранжируется 0...100% и в данном случае удобней работать с положительными значениями, верно?

int13h ★★★★★ ()
Последнее исправление: int13h (всего исправлений: 1)
Ответ на: комментарий от LongLiveUbuntu

Я думал, там в регистре специальный флажок под это дело выделяется для тех, кому действительно важно следить за переполнениями...

ilammy ★★★ ()
Ответ на: комментарий от ilammy

Прерывание тем и хорошо, что позволяет не проверять переполнение после каждой операции. Проверить переполнение можно и без флажка, только это гробит производительность.

Legioner ★★★★★ ()
Ответ на: комментарий от int13h

вообщем, да. копейка рубль бережет.

Ушлые маркетологи лучше сэкономят на тебе и купят лишний гигабайт памяти.

anonymous ()
Ответ на: комментарий от ilammy

Ты про флаг переноса? Можно попробовать и так, но задолбешься.

LongLiveUbuntu ★★★★★ ()
Ответ на: комментарий от Legioner

Они универсальны. Просто надо уметь работать с ними, как с unsigned.

Удовлетвориться и с мужиком можно, просто надо уметь с ним обращаться, как с женщиной, только через жопу.

proud_anon ★★★★★ ()
Ответ на: комментарий от int13h

смысл агрессии в том, что она ранжируется 0...100%

Наивный, вы ещё скажите что она больше 100% быть не может. А уж как в реальности строго положительные параметры становятся ниже нуля и говорить не стоит. Отсутствие беззнаковых типов тем и хорошо, что не позволяет ради экономии пары байт нажить себе геморрой, когда реальность расходится с твоим представлением о ней.

ya-betmen ★★★★★ ()
Ответ на: комментарий от ya-betmen

А уж как в

реальности строго положительные параметры становятся ниже нуля и говорить не стоит

-4 стула

int13h ★★★★★ ()
Ответ на: комментарий от int13h

Куда именно в беззнаковый тип вы вписываете слово «стул»?

Почему поле хранящее количество стульев не может быть отрицательным?

ya-betmen ★★★★★ ()
Последнее исправление: ya-betmen (всего исправлений: 1)
Ответ на: комментарий от ya-betmen

ну, смотри. У нас есть школа(-ы), и есть задача разместить в каждом классе этой(-их) школы стулья. В школе 129 кабинетов и известно, что в каждый кабинет вмещается до 220 стульев. Необходимо написать программу для учета стульев в каждом классе, иметь возможность редактировать количество стульев в каждом классе каждой школы. Какой тип данных рациональней использовать для решения это задачи?

int13h ★★★★★ ()
Ответ на: комментарий от int13h

Какой тип данных рациональней использовать для решения это задачи?

1. Набросайте свою модель данных
2. Посчитайте выгоду от использования тут беззнакового типа
3. Подумайте о том, сколько вам потребуется переписать если понадобится доработка, где необходимо будет учесть дефицит стульев (например это может сильно упростить расчёты / перестановку стульев из кабинета в кабинет)
4. Сравните выгоду из п2 и потери из п3.

ya-betmen ★★★★★ ()
Последнее исправление: ya-betmen (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.