Действительно ли поразрядное дополнение до единицы является реальной проблемой или просто исторической?

Чтобы избежать всех отрицательных эффектов инициализации двойной комбинации, например:

  1. Сломанная «равна» совместимости.
  2. При выполнении прямых назначений никаких проверок не выполнялось.
  3. Возможные утечки памяти.

делать следующие вещи:

  1. Сделать отдельный класс «Builder» особенно для инициализации двойной привязки.
  2. Объявить поля со значениями по умолчанию.
  3. Поместить метод создания объекта в этот класс.

Пример:

public class MyClass {
    public static class Builder {
        public int    first  = -1        ;
        public double second = Double.NaN;
        public String third  = null      ;

        public MyClass create() {
            return new MyClass(first, second, third);
        }
    }

    protected final int    first ;
    protected final double second;
    protected final String third ;

    protected MyClass(
        int    first ,
        double second,
        String third
    ) {
        this.first = first ;
        this.second= second;
        this.third = third ;
    }

    public int    first () { return first ; }
    public double second() { return second; }
    public String third () { return third ; }
}

Использование :

MyClass my = new MyClass.Builder(){{ first = 1; third = "3"; }}.create();

Преимущества:

  1. Просто использовать.
  2. Не разрывает совместимость «равно».
  3. Вы может выполнять проверки в методе создания.
  4. Отсутствует утечка памяти.

Недостатки:

  • Нет.

И, как результат, у нас самый простой шаблон java-строителя.

См. все образцы в github: java-sf-builder-simple-example

28
задан 2 revs 23 May 2017 в 12:09
поделиться

7 ответов

Это все сводится к знанию Ваших корней.
Да, это - технически старая техника, и я, вероятно, сделал бы то, что других людей, предложенных в том вопросе и, используют по модулю (%) оператор для определения нечетный или ровный. Но понимая то, что 1 дополнение с (или 2 дополнения с) всегда являются хорошей вещью знать. Используете ли Вы когда-нибудь их, Ваш ЦП имеет дело с теми вещами все время. Таким образом, никогда не может повреждать понимать понятие. Теперь, современные системы делают его так, Вы обычно никогда не должны волноваться о подобных вещах, таким образом, это стало темой для курсов Программирования 101 в некотором роде. Но необходимо помнить, что некоторые люди на самом деле все еще использовали бы это в "реальном мире"..., например, вопреки широко распространенному мнению существуют люди кто все еще блок использования! Не многие, но пока центральные процессоры не могут понять необработанный C# и Java, кто-то собирается все еще должным быть понять этот материал.

И heck, Вы никогда не знаете, когда Вы могли бы найти Ваш сам выполнение чего-то, где на самом деле необходимо выполнить двоичную математику и что 1 дополнение с могло пригодиться.

12
ответ дан Antti Haapala 28 November 2019 в 02:42
поделиться

Я работаю в области телеметрии, и у некоторых из наших клиентов есть старые аналого-цифровые преобразователи, которые до сих пор используют дополнение 1. Мне просто нужно было написать код на днях, чтобы преобразовать дополнение 1 в дополнение 2, чтобы компенсировать это.

Так что да, это все еще там (но вы не будете сталкиваться с этим очень часто).

14
ответ дан dongola7 28 November 2019 в 02:42
поделиться

CDC Кибер 18, которые я использовал назад в '80, были 1 машиной дополнения с, но это почти 30 лет назад, и я не видел ту с тех пор (однако, который был также прошлым разом, когда я работал над некомпьютерным)

10
ответ дан James Curran 28 November 2019 в 02:42
поделиться

Я никогда не встречался с системой поразрядного дополнения до единицы, и я кодировал, пока Вы имеете.

, Но я действительно встречался 9's дополнительная система - машинный язык калькулятора HP-41c. Я признаю, что это можно считать устаревшим, и я не думаю, что у них когда-либо был компилятор C для тех.

7
ответ дан Darron 28 November 2019 в 02:42
поделиться

Мы вышли из наших прошлых 1960-х Honeyboxen когда-то в прошлом году, который сделал его нашей самой старой машиной на сайте. Это было дополнение two. Это не должно говорить, что знание или быть знающим о поразрядном дополнении до единицы являются плохой вещью. Просто, Вы никогда не будете, вероятно, сталкиваться с проблемами поразрядного дополнения до единицы сегодня, неважно, сколько компьютерной археологии они сделали, чтобы Вы сделали на работе.

проблемы, с которыми Вы, более вероятно, столкнетесь на целочисленной стороне, порядок байтов проблемы (я смотрю на Вас PDP). Кроме того, Вы столкнетесь с большим "реальным миром" (т.е. сегодня) проблемы с плавание точка форматы , чем Вы будете целочисленные форматы.

6
ответ дан user7116 28 November 2019 в 02:42
поделиться

Я решил найти один. Системы Unisys ClearPath имеют компилятор ANSI C (да, они называют его «Американским национальным стандартом C», для которого даже документация в формате PDF последний раз обновлялась в 2013 году. Документация доступна онлайн ;

Там все подписанные типы используют представление дополнения со следующими свойствами:

Type                 | Bits | Range
---------------------+------+-----------------
signed char          |   9  |  -2⁸+1 ...  2⁸-1
signed short         |  18  | -2¹⁷+1 ... 2¹⁷-1
signed int           |  36  | -2³⁵+1 ... 2³⁵-1
signed long int      |  36  | -2³⁵+1 ... 2³⁵-1
signed long long int |  72  | -2⁷¹+1 ... 2⁷¹-1

Примечательно, что он также по умолчанию поддерживает несоответствующие unsigned int и unsigned long, которые диапазон от 0 ... 2³⁶ - 2, но может быть изменен на 0 ... 2³⁶ - 1 с прагмой.

5
ответ дан 2 revs 28 November 2019 в 02:42
поделиться

RFC 791 p.14 определяет контрольную сумму заголовка IP следующим образом:

Поле контрольной суммы является 16-битным дополнением к 16-битной сумме всех 16-битных слов в заголовке. Для целей вычисления контрольной суммы значение поля контрольной суммы равно нулю.

Таким образом, в реальном мире в каждом посылаемом IP-пакете все еще используется тяжело. :)

12
ответ дан 28 November 2019 в 02:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: