Как стать автором
Обновить

Комментарии 7

Простите, но «нолик», «единичка», «массивчика», меня одного передергивает от изложения курса информатики техникума в формате фиксиков?

«если мы хотим сложить 75 и –75, то в прямом коде это делать неудобно, потому что у нас не получится 0.» — получится, если использовать подходящие под формат библиотеки.
получится, если использовать подходящие под формат библиотеки

автор просто пытался сказать немного другое. но не смог )


речь про то, что уже реализовав в процессоре alu, умеющее складывать и вычитать беззнаковые числа, логично попробовать использовать этот alu без изменений для операций со знаковыми числами. а ещё неплохо бы, чтобы знаковое число 1 и беззнаковое число 1 записывались одним и тем же набором битов, да и чтобы можно было производить смешанные операции между знаковыми и беззнаковыми числами.
сегодня, кстати, это всё уже не кажется такой безоговорочно хорошей идеей.


так вот, исходя из этих требований, и был придуман/выбран тот самый дополнительный код.
это можно было, наверное, развить в статью, но у автора получилось что получилось.

поддержу, фраза про 75 и -75 корявая. если складывать как автор, то и в десятичной получится -150

Может оказаться, что наша чек-сумма разъедется потому, что вместо положительного числа у нас получится отрицательное.

Насколько я представляю себе чек-сумму - там внутри беззнаковые числа.

Проблемы Java 8 с signed/unsigned отлично описаны в документации.

int: By default, the int data type is a 32-bit signed two's complement integer, which has a minimum value of −231 and a maximum value of 231−1. In Java SE 8 and later, you can use the int data type to represent an unsigned 32-bit integer, which has a minimum value of 0 and a maximum value of 232−1. Use the Integerclass to use int data type as an unsigned integer. See the section The Number Classes for more information. Static methods like compareUnsigneddivideUnsigned etc have been added to the Integer class to support the arithmetic operations for unsigned integers.

long: The long data type is a 64-bit two's complement integer. The signed long has a minimum value of −263 and a maximum value of 263−1. In Java SE 8 and later, you can use the long data type to represent an unsigned 64-bit long, which has a minimum value of 0 and a maximum value of 264−1. Use this data type when you need a range of values wider than those provided by int. The Long class also contains methods like compareUnsigneddivideUnsigned etc to support arithmetic operations for unsigned long.

Но беззнаковые надо будет инициализировать руками, рассчитывая соответствующее отрицательное значение.

Поправьте меня, если сейчас что-то поменялось.

По названию ожидал увидеть, что-то из услады хакеров. Всю статью можно было в два предложения уместить: "Умножение в процессоре ­— это много сдвигов и сложений" и "Сложение по модулю работает так же как обычное сложение".

В длинной арифметике ожидал, что хотя бы дойдёт до Карацубы.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий