> В смысле? я чет не понял, проясните о какой емкости идет речь? О информационной емкости памяти. Если у памяти завести дополнительное состояние указывающее что оно не инициализированая + 2 состояния - о, круто, треть емкости профачена на бесполезняк.
> Я вообще-то про регистровую память говорил с фиксированной емкостью в битах
> (32 бита - еах к примеру) и как была она 32 бита, так и остается.
Хранить 32 бита как только 1 и 0 это одно. А если еще третье состояние завести - это более сложная схема, чудес не бывает.
Хотя некие разновидности идеи используются. Скажем в некоторых диалектах Ethernet бывает PAM-3 или PAM-5 кодирование. Но это именно line coding, и такая структура сигнала возникает от требований zero DC bias (т.к. оно через трансформатор). Или в MLC флеше - усилитель чтения различает несколько уровней заряда, но вот там обычно число состояний кратно 2, для упрощения схем вокруг. Но наружу это как раз и не вылезает. Для упрощения "обвязки".
> А суть, и собственно НЕОБХОДИМОСТЬ "третьего" состояния бита информации, в том, что
> - при использовании "полной позиционной двоичной системы счисления" не
> работает "правило лидирующих незначимых нулей".
Никто не будет усложнять схемы на минимум треть чтобы порадовать любителей абстракций. А практические инженерные проблемы решаются более чем 1 способом, эффективно чем "лобовое" решение.
> системе счисления значение регистра 00000100 (4) не отличается от 100 (4),
Правильно. Этим оно и прекрасно. Состояние регистра всегда однозначно декодируемо. Ресет стараются всегда делать в оговоренное детерминированное состояние. И проч. И это как раз все делает сильно проще. И в схемотехнике и в понимании.
> так как это два одинаковых представления числа, с применением правила лидирующих
> незначимы нулей. А вот в полной двоичной системе счисления это не
> то чтобы два разных числа, это семь разных представлений семи разных чисел,
Что ведет к неэффективности на уровне схемотехнике и непоняткам. А потому нафиг надо.
> Вопрос, как их отличать если наш регистр если не хранит значение бита
> как 1, то хранит заведомо 0?
В двоичной логике нет понятия "регистр не хранит значение бита". Условились что всегда что-то хранится. В 8 бит регистре всегда 8 битов. И этот самый трекинг "хранится или не хранится" и ожрет часть емкости памяти, если кто не понял. Это крайне неэффективно. Треть схемы угрохана ни на что. Представьте себе что вместо 2 ядер проца можно 3 поставить на ту же площадь. А вместо 4 уже 6. Все еще хочется подарить треть площади абстракциям?
А вон то - упростило абстракцию и схемотехнику. Все что не 1 и 0 - undefined и в конечном итоге будет считано как либо 1 либо 0 а undefined лишь в том что не гарантируется конкретное из 2 значений. Более того - операции полной ширины проще в технической реализации. Всегда тупо толкнуть 8 битов в шину - сильно проще (и быстрее) чем выколупывать только нужные.
> Как по мне, есть три решения:
> 1) Придумать что-то вроде динамического регистра. Это отдельная тема для рассуждений.
> 2) Если оставить фиксированный размер регистра, то необходимо ввести новый регистр "регистр
> длины".
Я знаю одно забавное решение на тему - ASAN делает. Он загрубляет трекинг регионов до байта, и хранит по биту на 1 байт. Этим оверхед снижается до 1/8 от размера памяти что куда лучше 1/3 на битовом уровне. Но это ведет к ряду иного оверхеда и в целом тяжелая и медленная фича, при том в целом - программная, живущая по специфичным поводам как то трекинг ошибок софта в работе с памятью. Это не совсем то и не в хардваре, но идея немного похожа по общей логике действа.
> истинное значение регистра А - 000100 (66)
В обычной двоичной логике условились просто игнорить leading zeros считая одинаково. Это как раз все сильно упростило. В чем прелесть этой штуки и состоит. Это самое простое на уровне реализации в схемах решений.
> 3) Придумать "третье" состояние (незначимое значение) бита - допустим *. Тогда регистр
> А будет содержать следующее значение.
Это все надо где-то как-то хранить. Как и лишние регистры. Что как бы не халявно по схемотехнике. И еще, одно дело пульнуть регистр в шину "как есть". Другое - разбирать это все выколупывая битики. Прелесть той двоичной логики в том что она упрощена до предела. Это минимальный набор математики который все еще работает. А его специфичная природа позволяет веселые оптимизации и в железе, и в софте. Тот же XOR допустим достаточно забавная операция, которую при должном абстрагировании можно эффективно к много чему привинтить. И прелесть всего этого в том что это тупо, брутально, простыми схемами, а потому - за 1 такт.
> И это не "троичность" как может показаться, это аппаратное распознавание, или динамический
> регистр (хотя я его представляю немного иначе)
Да я понял о чем вы. Но де факто это тоже третье состояние и оно тоже жрет емкость памяти и сложность схем и потому мало чем отличается с точки зрения реализации.
> Ну да, но не в качестве значения бита ведь.
Абсолютно. Факт перехода - используется для координации момента защелкивания очередного бита, сигналя ремотной стороне что сейчас самое время утащить бит (биты). Это актуально для кусков систем живущих в разных clock domains. У какой-нибудь SPI флешки если тактирование внутри и есть, то какое-то свое. Никак не связанное с МК допустим.
> Если я буду использовать это состояние в качестве значения бита, то получиться
> троичная система счисления.
Да я понял о чем вы. Но с практической точки зрения что совой о пень что пнем о сову, хранить третье состояние как-то где-то надо и на уровне схемотехники и емкости памяти примерно один фиг по проблематике будет. Так что отличия больше в формальностях абстракции.
p.s. это вы еще не видели что можно выделывать с шинами где 2 провода. А если там еще и разные уровни сигналов закатить как MIPI DSI... но там половина инженеров сойдет с ума пытаясь осознать как ЭТО вообще работает.
>> Двоичная система прекрасна тем что это математика упрощенная до предела.
> А зачем тогда отказались от полной мощности представления чисел?
Я уже сказал - та двоичная система сделана такой для максимально простой и компактной реализации в железе. Там просто нет понятия "ячейка не хранит информацию". Это понятие - wasteful. Теряет часть информационной емкости системы by design и усложняет схемы.
> этот вопрос? Кто и когда решил лишить человечество полной мощности представления
> чисел "упрощая до предела арифметику"?
Вероятно, это случилось на заре становления цифровой логики, очень много лет назад. Когда условились что вольтаж равный 0 относительно земли это 0, а Vcc (питание) - единица. Коммутация между ними делается тривиально, парой транзисторов или типа того. Изначально даже дискретных - а потом и "несколько" на 1 кристалле. Паттерн оказался удачным и эффективным, а под него нашлись нехилые оптимизации математики использующие те свойства. Многое крипто штатно уповает на допустим wrap-around N-bit регистра. А какие-нибудь LFSR вполне целенаправленно соединяют выходы и входы. С понятием "нет значения" этот фокус стал бы многократно сложнее.
> Предлагаю, просто реализуйте сумматор (однобитовый фулл) для "полной двоичной системы
> счисления" и сравните.
Мне оно зачем? Я просто в курсе некоторых азов цифровой схемотезники - ну и понял почему они это делают - вот так. Знание лидирующих битов не дает особых преимуществ. А то что 8 битов всегда гарантировано 8 битов позволяет нехилые оптимизации - и железа, и софта.
> Стало после сдвига:
> 0 - 2
> 1 - 3
> 00 - 4
> 01 - 5
> ....
Чем-то код Грея напоминает. Но зачем возиться с сдвигами? Двоичная система интересна тем что все в лоб, максимально просто и брутално. При этом она достаточно проста в осознании на самом деле.
> И сново попробуйте реализовать сумматор :)
У меня есть ряд более интересных занятий, уж простите. Мой пойнт в том что знать usage бита избыточно и нафиг нужно. Только лишний оверхед зазря.