5

В старые времена 8-битная информация и 8-битные компьютеры хорошо ладили

Был ASCII из 8 битов, поэтому один байт - это один символ и одна и вся позиция в памяти / диске

затем пришли 16-битные, 32-битные и 64-битные компьютеры, но я потерял путь

как хранятся символы? Используется ли 16/32/64 бит ASCII ??

Что делать, если у меня есть данные шириной 8 бит? я могу хранить много символов в одной позиции?

например, для 32 бит, если используются только 8 бит, есть 24 бита неиспользованными?

положение памяти / диска-> 0000000 00000000 0000000 xxxxxxx

или направление памяти / диска 16/32/64 продолжает указывать на 8 бит вместо 16/32/64-битных слов?

так 8 битов все еще живы и здоровы? кажется ДА

РЕДАКТИРОВАТЬ

Забыв про ASCII, я хотел бы знать, указывает ли один адрес (внутри памяти / диска) на один 8-битный байт на платформе 8/16/32/64 бит

5 ответов5

5

Если оно больше 8 бит, символ не является ASCII по определению. Числа все еще числа.

Байты все еще являются байтами. Компьютеры с более широкими путями передачи данных просто захватывают их больше одновременно. 32-битная система будет обрабатывать 4 байта за раз, а 64-битный компьютер будет использовать 8 байтов.

То, как диск управляет данными, является отдельной проблемой - он будет делать свое дело внутренне и отвечать на интерфейс (SATA и т.д.) Порциями данных надлежащего размера.

2

Размер адресного пространства в байтах. Например, вы покупаете компьютер с 4 ГБ ОЗУ или 3 ТБ диска. Таким образом, адреса также указывают на один байт.

При адресации более 8 бит вы также ссылаетесь на следующие байты. Предположим, у вас есть указатель на адрес 104. Если вы загружаете в 64-битный регистр, вы получаете байты с 104 по 111. Если вы храните, вы перезаписываете эти адреса.

Ваш основной вопрос о том, как символьные данные хранятся в памяти, как в оперативной памяти, так и на диске? Как правило, данные в рабочей памяти занимают больше места, но с ними легче работать; в то время как на диске это более компактно, с некоторой кодировкой символов. Но есть много вариантов, и плюсы и минусы для них.

Например, символы нередко всегда занимают по два байта в памяти, но при хранении на диске занимают от одного до четырех байтов. Например "ABC" в памяти: 65 00 66 00 67 00; на диске: 65 66 67. Для специального символа, известного как Метка порядка байтов, в памяти: 255 254; на диске: 239 187 191. Это символы Unicode, хранящиеся в кодировке UTF-8 на диске.

(И технически говоря, ASCII является 7-битным; он определяет только 128 символов. Unicode - это 16-битный расширенный набор ASCII.)

1

Все немного сложнее, чем простые ответы, данные до сих пор.

Есть 2 аспекта: машина и хранилище.

На машине:

Это зависит от аппаратной архитектуры.

На ПК адресация является байтовой, и вы можете получить доступ к байту (8 битов), слову (16 битов), двойному слову (32 бита) и четырем словам (64 бита).

На других архитектурах у вас может быть доступ только к некоторому "большому размеру" "блоба" для машинного типа данных. Например, на TMS320C40 вы можете получить доступ к 32-битным словам, и 8-битные байты упакованы в эти слова. Вы можете упаковать байты в и из, но это довольно медленный процесс, требующий нескольких машинных инструкций.

Итак, на этом TMS320C40 компилятор C имеет собственный тип char, который является 32-битным!

(при программировании на C никогда не предполагайте, что char равен 8 битам. Прочитайте руководство по компилятору, особенно если вы занимаетесь встроенным программированием).

Ситуация становится еще более сложной, когда в игру вступает порядок байтов, есть 2 общих порядка: байты с младшим и старшим порядком, это описывает, как байты располагаются так, чтобы вписываться в большее количество (обычно это машинный размер слова). Так, например, на 32-битной машине вы можете найти байты, расположенные так:

Адрес X: Байт 0, Байт 1, Байт 2, Байт 3

Адрес X+4: Байт 4, Байт 5, Байт 6, Байт 7

ИЛИ ЖЕ

Адрес X: Байт 3, Байт 2, Байт 1, Байт 0

Адрес X+4: Байт 7, Байт 6, Байт 5, Байт 4

(И это становится еще более сложным, потому что биты в байте также имеют порядок байтов).

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

Простого примера может быть достаточно:

Дамп блока памяти по адресу X может представлять поток байтов:

01 02 03 04 05 06 07 08

НО дамп того же блока с того же адреса и представленный как 16-битные (шестнадцатеричные) целые числа может выглядеть как:

0201 0403 0605 0807

И дамп снова с того же адреса, что и 32-битные целые числа в шестнадцатеричном формате, может выглядеть как

04030201 08070605

Это вызывает огромную путаницу у непосвященных, потому что все зависит от порядка байтов и метода (порядка байтов), используемого для создания больших количеств из меньших.

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

Массовое хранение.

К счастью, здесь жизнь становится легче.

Просто представьте, что ваше хранилище данных - это огромная куча байтов, к которым можно получить доступ, и машина волшебным образом позаботится обо всем этом. Общий термин, используемый для обозначения файлов, - это "поток", где вы начинаете с самого начала, и поток начинает действовать. (Это удобно игнорирует произвольный доступ.) Наименьшая часть, на которую можно разбить поток файла, - это байт.

Если машина хочет хранить большие объемы (16-битные слова и т.д.), То она может или не может выполнить какой-либо уровень преобразования, чтобы передать его в байты, которые поступают в хранилище.

Предостережения.

Все вышеперечисленное относится к базовым вещам низкого уровня - байты, слова и так далее.

Программы используют это разными способами. Так, например, вы получите CHARACTERS, представленные байтами, если они удачно вписываются в простой ASCII (или даже EBCDIC для тех, у кого длинные воспоминания). Современные системы символов Unicode могут использовать широкие символы (обычно это 16 бит), но существует множество систем кодирования для Unicode. Страница Wikipedia на Unicode довольно поучительна.

В эти дни принято считать, что CHARACTER = BYTE вводит в заблуждение и вводит в заблуждение. Лучше всего использовать слово "char" как синоним "byte" - если только ваш компьютер / компилятор не скажет иначе (см. Выше). Программы GOOD C обычно определяют набор предпочтительных типов, таких как "UINT8" - 8-разрядное целое число без знака, "SINT8" - 8-разрядное целое число со знаком и т.д., Так что написанная программа становится настолько независимой, насколько это разумно возможно, от особенностей конкретный компилятор и базовое оборудование.

На конкретный вопрос: как хранятся символы? Ответ: это зависит. Часто символы ascii, которые помещаются в байт, сохраняются как байт. Широкие символы часто хранятся в виде 16-битных слов. Но Юникод может реализовывать широкие символы или одну из любого числа систем кодирования, и в этом случае символы могут занимать от 1 до 4 байтов, в зависимости от символа.

1

Сегодняшняя RAM, так же как и RAM в 1970-х годах, по-прежнему адресуется 8 битами за раз. Таким образом, каждый адрес памяти указывает на 8-битный байт.

Когда были разработаны 16-битные процессоры, они сохранили возможность адресовать 8 битов одновременно для скорости и совместимости. Существуют различные компоненты процессора, которые могут иметь «битность», одним из них является ширина регистра. Но почти все 16-битные или более мощные процессоры имеют инструкторы для доступа к старшим или младшим 8 битам регистра. Таким образом, то, что процессор имеет так много битов, не означает, что он должен иметь доступ к памяти или регистрам такого размера.

Итак, чтобы ответить на ваши вопросы:

направление памяти / диска 16/32/64 продолжает указывать на 8 бит вместо 16/32/64-битных слов? Да. 32-битный ЦП, загружающий 32 бита в регистр из заданной ячейки памяти, собирается извлечь 4 байта из DRAM и поместить его в регистр.

8 битов еще живы и здоровы? Да. Процессор Motorola 68000, хотя и представлял собой 16-разрядный чип (некоторые утверждают, что он 32-разрядный), имел инструкцию ADDQ (для ADD QUICK), которая брала операнд из регистра или памяти и добавляла его в 8-разрядный значение фактически закодировано в самой инструкции. Я не знаю слишком много о сборке x86, но я уверен, что есть подобные инструкции, которые ограничивают скорость до 8 бит.

0

64-битные процессоры могут обращаться к 8-битным данным.

Один char хранится в одном байте.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .