http://ksniko.livejournal.com/ (
ksniko.livejournal.com) wrote in
useless_faq2013-06-27 07:54 pm
Нумерация
А вот почему нумерация домов на улице начинается с единицы, а нумерация памяти в компьютере – с нуля?
Это случайно или в этом есть некий сакральный смысл?
А можно ли наоборот?
Дома с нуля, память с единицы?
Если нельзя, то почему?
Это случайно или в этом есть некий сакральный смысл?
А можно ли наоборот?
Дома с нуля, память с единицы?
Если нельзя, то почему?
no subject
Но некоторая сложность все таки была бы. Сейчас в компьютерах памяти как правило меньше максимума (например, стоит 2Gb хотя вся система может и 64Gb поддерживать), а раньше это ограничение было критичным, во время 286ых например. Оно имеет "физическую" природу - количество бит шины адреса. Ну и сейчас, наверное, кто-то мучается с тем что больше 64G не лезет.
Соответственно, и адресация должна имеет столько же бит, сколько шина адреса. Можно больше, но это нерациональный расход памяти.
Так вот, если переменная-указатель, содержит значение 0, то как называть, чему оно равно? единице, а 1 равно двойке? :-)
Поэтому для адресации памяти, как-то все таки проще с нуля начинать.
no subject
принцип такой - имеем какую то структуру данных располагающуюся по адресу ХХХХ, для простоты путь будут байты, соответсвенно первый байт будет находится по этому адресу со смещением 0, второй - со смещением 1 и т.д., логично же ?
так работают команды на самом низком уровне - уровне ассемблера, загружаем адрес в регистр и просто "щелкаем" смещением, команды процессора (например всех х86, начиная с 8086) напрямую это поддерживают, и это так же отобразили на уровне С++ и прочих языков
no subject
Первый абзац (про "логично же") - все верно, и логично и достаточно просто - но это лишь один из множества возможных взглядов на ситуацию (может быть даже самый логичный, но не единственный).
Для указателей, как вариант, вполне можно 0x0 называет единицей, 0x1 называть двойкой, итд.
Или же для обращения к первой ячейке памяти (которая offset 0), использовать значение 0x1, к следующей - 0x2, ну и далье. А для последней - не 0xFF..FF, а 0x0. (это уже потребует изменения "железа")
Это непривычно, хотя может быть даже и не так уж нелогично. Ну и по сути - разная трактовка значений в переменной - давно уже используется. То же 0xFFFFFFFF, в обычных целых переменных, оно иногда равно MAXINT'у, а иногда -1, в зависимости от того, хотим мы ее воспринимать как signed или unsigned.
Можно даже нумеровать память отрицательными или комплексными числами. Или даже цветами:
MOV AX, дерзко-небесно-бирюзовый
только свою математику цветов нужно в этом случае ввести, где бы, например дерзко-небесно-бирюзовый +1 = чертовски-дерзкий-небесный-цвет :-)
Вопрос ведь не про традиционный взгляд, и не про удобный способы нумеровать ячейки, а про возможность вообще.
no subject
#define TRUE FALSE //Happy debugging suckers
#define NULL (::rand() % 2) // would be quite nice aswell
для отладки такого кода с цветами надо будет использовать только приговоренных к смертной казни, причем только альтернативно ориентированных.
одна только чехарда с началом от 0 или от 1 уже может стоить пол кило нервных клеток