|
Ушел с форума
16377 / 7689 / 1080
Регистрация: 11.11.2010
Сообщений: 13,768
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 10.11.2013, 17:19 [ТС] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ГЛАВА 2 ПРЕДСТАВЛЕНИЕ ДАННЫХ (часть 2/4) Почему в байте именно 8 бит? Ранние ЭВМ имели размеры машинных слов и байтов, отличные от 8 бит, как правило, кратные шести. В 1950-х–1960-х годах многие ЭВМ использовали 6-битную кодировку символов, поэтому длина байта была первоначально кратна шести битам. Восемь бит в байте использовалось в IBM System/360. Это стало стандартом де-факто. С начала 1970-х в вычислительной технике используют байты, состоящие из 8 бит, и машинные слова, кратные 8 битам. Появление 8-битных байтов у System/360 связано, вероятно, с использованием BCD-форматом представления числа (BCD — binary-coded decimal — двоично-десятичный код): по 4 бита на каждую цифру (0-9), таким образом один байт представлял две десятичные цифры. В System/360 были специальные инструкции для обработки данных такого формата, для представления BCD было бы трудно использовать 6-битные байты, поэтому 8 бит в байте стало наилучшим решением. По другой версии, 8-битный размер байта связан c 8-битным числовым представлением символов в кодировке EBCDIC: один байт — один символ. Остается удивляться прозорливости пиратов, которые в XVII веке назвали битом именно 1/8-ю монеты!Группа из 16 взаимосвязанных бит (двух взаимосвязанных байт) называется машинным словом (WORD). Соответственно группа из четырех взаимосвязанных байтов (32 бита или два слова) называется удвоенным словом (DOUBLE WORD). Группа из восьми байтов (64 бита или два удвоенных слова) — учетверенным словом (QUADRUPLE WORD), группа из 16 байтов (128 бит или два учетверенных слова) — параграфом (PARAGRAPH) или двойным учетверенным словом (DOUBLE QUADRUPLE WORD), группа из 4096 байтов (256 параграфов) — страницей памяти (MEMORY PAGE) (таблица 2.1.4). Термины «бит», «байт» и «слово» используются для описания как элементов данных, которые обрабатывает компьютер, так и элементов памяти. Типы данных В общем случае под целое число можно отвести любое число соседних битов памяти, однако система команд компьютера поддерживает работу с числами размером в байт, слово, двойное слово. Поэтому целые числа представляются только байтом, словом, двойным словом и так далее.
Представление отрицательных двоичных целых чисел Рано или поздно возникает потребность представлять в двоичном коде отрицательные числа. А как в двоичной системе представить отрицательное число, если мы не можем использовать для этой цели минус как в традиционной десятичной системе? Как, например, должно выглядеть в двоичной системе -1? По определению, для каждого натурального числа n существует одно и только одно отрицательное число, обозначаемое -n, которое дополняет n до нуля: n + (-n) = 0. Найдем такое 4-битное число, которое при сложении с числом 5 (0101b) дало бы нам ноль, переносом в 5-й бит мы пренебрегаем (рис 2.2.1).рис 2.2.1
Рис. 2.2.2. Форматы представления целых чисел Дополнительный код
Способ первый — классический: взять число в прямом коде, преобразовать его в инверсный код. Для этого все нули этого числа необходимо заменить на единицы, а единицы на нули. К числу в инверсном коде добавить 1. На рис. 2.2.3 пример преобразования числа +7 в –7. Рис. 2.2.3 256 – 7 = 249 = 1111 1001b = 0F9h = – 7. Способ третий — студенческий: щелкаем по клавише «Пуск», открываем стандартные приложения, запускаем калькулятор в режиме инженерный, теперь щелкаем по клавише 7 и «+/–» на экранчике калькулятора появится –7. А теперь жмем на клавишу F8 или мышкой по переключателю с надписью «Bin». Что мы видим на экране калькулятора? Число 11111111111111111111111111111001b. Многовато, на экране — двойное слово. Жмем на F4 или мышью по переключателю с надписью Byte. Наше число приобрело нормальный вид 11111001b. На самом деле, нет необходимости пересчитывать отрицательные числа. Вы пишете –7, а транслятор автоматически подставит туда, где нужно число 11111001b. Если мы пренебрегаем знаковым разрядом, то диапазон чисел увеличивается в 2 раза: Попрактикуемся и найдем 8-битный эквивалент –5: 0000 0101b двоичное представление +5. 1111 1010b инвертируем все биты. 1111 1011b добавляем 1. Проделаем обратное преобразование: 1111 1011b двоичное представление –5. 0000 0100b инвертируем все биты. 0000 0101b добавляем 1 и получаем +5. А теперь поэкспериментируем с 16-битными положительными и отрицательными числами: 7FFFh (+32767, наибольшее 16-битное положительное число), 4000h (+16384), 0 и 8000h (–32768, наименьшее 16-битное отрицательное число). Получим отрицательные эквиваленты чисел: 0111 1111 1111 1111b 7FFFh (+32767) 1000 0000 0000 0000b инвертируем все биты (8000h) 1000 0000 0000 0001b добавляем 1 (8001h или –32767) 0100 0000 0000 0000b 4000h (16384) 1011 1111 1111 1111b инвертируем все биты (0BFFFh) 1100 0000 0000 0000b добавляем 1 (0C000h или –16384) 0000 0000 0000 0000b 0 1111 1111 1111 1111b инвертируем все биты (0FFFFh) 0000 0000 0000 0000b добавляем 1 (0) «Ноль» — он и в Африке «ноль». Получим положительный эквивалент числа 8000h: 1000 0000 0000 0000b 8000h (–32768) 0111 1111 1111 1111b инвертируем все биты (7FFFh) 1000 0000 0000 0000b добавляем 1 (8000h или –32768). После смены знака число 8000h не изменилось! –(–32768)=–32768. Почему? Дело в том, что число +32768 нельзя представить как 16-битное число со знаком (вспомните, то же самое у нас получилось с четырехбитным числом 8). При выполнении операции смены знака у числа –32768 микропроцессор x86 выставит признак арифметического переполнения. Расширение знака и расширение нуля Возьмем десятичное число –64. Ему соответствует 8-битное число 0C0h, 16-битное 0FFC0h и 32-битное 0FFFFFFC0h. Для числа +64 8-битный эквивалент 40h, 16-битный — 0040h и 32-битный — 00000040h.Примеры расширения знака Разницу между 8 и 16/32/64-битными эквивалентами можно выразить следующими словами: «если число отрицательное, то слева к 8-битному эквиваленту дописывается 0FF/0FFFFFF/0FFFFFFFFFFFFFF, а если число положительное, то к 8-битному числу слева дописываются нули» или, другими словами, происходит «растягивание» знакового бита.
Если мы рассматриваем беззнаковое десятичное число 128, то ему соответствует 8-битное число 80h, 16-битное — 0080h и 32-битное — 00000080h. Для расширения 8-битного числа до 16/32/64-битного к нему слева дописывают недостающие нули, происходит «расширение нуля». Примеры расширения нуля Иногда, для сокращения размера кода команд, вместо 32-битного числа используют его 8-битный эквивалент, но это можно проделать лишь с ограниченным диапазоном чисел от –128 до +127.
0FFFFFF80h (–128) можно сократить до 8 бит (80h) 00000040h (+64) можно сократить до 8 бит (40h) 0FFFFFE40h (–448) нельзя сократить до 8 бит 00000100h (+256) нельзя сократить до 8 бит. Представление чисел с плавающей запятой У десятичных чисел каждая позиция числа соответствует степени числа 10, то есть число 1234,56=1*103+2*102+3*101+4*100+5*10-1+6*10-2.Запятая показывает границу между позицией, соответствующей 100, и дробной частью. В дробной части позиции числа также являются степенями числа 10, но эти степени теперь отрицательные. Дробные двоичные числа записываются аналогично дробным десятичным, но основание системы счисления здесь 2, а не 10. Например, Чтобы получить эквивалент целого числа в двоичной системе, мы использовали последовательное деление на 2. Чтобы получить эквивалент десятичной дроби, используем обратную операцию — последовательное умножение на 2. Для перевода десятичной дроби в двоичную систему можно использовать три способа, а уж который из них Вам покажется более удобным — выбирайте сами. Способ первый. Дробную часть числа последовательно умножают на 2 пока либо дробная часть не станет равной нулю, либо не будет получено необходимое количество разрядов. Целые значения, получаемые при умножении, будут являться эквивалентом десятичной дроби в двоичной системе. Посмотрите конкретный пример на рис. 2.4.1. рис. 2.4.1 Способ третий. Любое дробное двоичное число можно представить как x1*0,5 + x2*0,25 + x3*0,125 +…, где x1, x2, …xn — нули или единицы, то есть 0,1=0,0001100b.Способ четвертый. Переведем в двоичную систему, например, число 0,27=27/100. Ближайшая к 100 степень двойки 27=128. Перевод десятичного дробного числа 0,406 в hex-систему делается аналогично переводу к двоичному виду: Для перевода вещественного целого числа в двоичную или hex-систему необходимо целую и дробную часть перевести по отдельности в двоичную или hex-систему, а затем соединить их. Например, число Существует два способа записи вещественных чисел: Первый способ — целая часть числа отделяется от дробной символом запятой, расположенной между конкретными разрядами в фиксированной позиции. Такой способ записи называют представлением вещественных чисел с фиксированной запятой. Если отвести под целую часть числа 8 разрядов, а под дробную 8 разрядов, то максимально большое число, которое можно записать таким способом: Второй способ применяется в астрономии, физике, химии, математике для записи очень больших либо очень маленьких чисел. Например, скорость света в вакууме составляет около Если под мантиссу отвести 8 разрядов и 8 разрядов под порядок числа (из 8 разрядов 1 разряд отводится под знак и 7 разрядов под число), то максимально возможное наибольшее число Для представления в компьютере дробного числа первый разряд числа считается знаковым и обозначает знак мантиссы. За ним следует мантисса (число со значением больше или равным 1 и меньшим 2) и порядок (степень числа 2). Представление чисел в виде мантиссы и порядка позволяют сводить умножение и деление чисел к сложению и вычитанию показателей степеней, а возведение в степень и извлечение корня — к умножению и делению на показатель степени, что упрощает и сокращает сложные вычисления. Вещественные числа в памяти компьютера хранятся в нормализованном виде, то есть оно обязательно должно иметь следующий вид: Из-за того, что целая часть вещественного числа в двоичной системе всегда равена 1, его, из соображений увеличения разрядности числа, предпочитают «хранить в уме». Для упрощения вычислений значение порядка хранят не в дополнительном коде (то есть не в виде целого со знаком), а в смещенном коде (таблица 2.4.1) в виде суммы с некоторым числом, это позволяет облегчить сравнение вещественных чисел — в большинстве случаев достаточно сравнить их экспоненты. Обратите внимание, что в смещенном порядке у отрицательных чисел и нуля в двоичном представлении старший разряд нулевой. В смещенном коде число суммируется с константой, которая для N-битного кода равна 2N-1-1.
Преобразуем вид числа 4341C000h в бинарное представление:
Рис. 2.4.2. Форматы представления вещественных чисел
Для записи вещественного числа в программе пересчет вещественного десятичного числа из десятичной системы в hex или двоичную самому делать не обязательно, просто запишите число, используя в качестве разделителя точку вместо запятой:
Теперь читателю предлагается потренироваться в переводе чисел. Пред вами два простых примера: 0.125 и 0.625. Можно усложнить их: 23.125 и 456.625. Проверьте свои ответы, записав результат в переменную типа dword, и посмотрев под отладчиком число в стеке FPU. Автор настаивает на такой практике, даже если вы не новичок. Битовое поле Непрерывная последовательность бит, в которой каждый бит является независимым и может рассматриваться как отдельная переменная. Битовое поле может начинаться с любого бита и содержать до 32 бит.
0
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|