Смекни!
smekni.com

Общие представления о языке Java 5 (стр. 25 из 68)

Машинным словом называют порцию данных, которую процессор компьютера может обработать за одну операцию (микрокоманду). Первые персональные компьютеры были 16-разрядными, т.е. работали с 16-битными (двухбайтными) словами. Поэтому операционные системы для этих компьютеров также были 16-разрядными. Например, MS DOS. Операционные системы для персональных компьютеров следующих поколений были 32-разрядны (Windows® ’95/’98/NT/ME/2000/XP, Linux, MacOS®), так как предназначались для использования с 32-разрядными процессорами. Современные операционные системы либо 32-разрядны, либо даже 64-разрядны (версии для 64-разрядных процессоров).

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

Двоичное представление положительных целых чисел

Целые числа в компьютере обычно кодируются в двоичном коде, то есть в двоичной системе счисления. Например, число 5 можно представить в виде

. Показатель системы счисления принято записывать справа снизу около числа.

Аналогично,

,
,
,
,
, и так далее. Всё очень похоже на обозначение чисел в десятичной системе счисления:
. Но только в качестве основания системы счисления используется число
. У чисел, записанных в десятичной системе счисления, индекс 10 обычно не пишется, но его можно писать. Так что
,
, и так далее.

В двоичной арифметике всего две цифры, 0 и 1. Двоичный код положительного целого числа – это коэффициенты разложения числа по степеням двойки.

Умножение числа на двоичное десять, то есть на

, приводит к дописыванию справа нуля в двоичном представлении числа. Умножение на двоичное сто, то есть на
- дописыванию двух нулей. И так далее.

Целочисленное деление на

с отбрасыванием остатка производится путём отбрасывания последнего (младшего) бита, деление на
- отбрасывания двух последних бит, и так далее.

Обычно такие операции называют побитовыми сдвигами на n бит влево (умножение на

) или вправо (целочисленное деление на
).

Сложение двоичных чисел можно производить “в столбик” по полной аналогии со сложением десятичных чисел. Единственное отличие – то, что в двоичной арифметике только две цифры, 0и1, а не десять цифр (от 0 до 9) как в десятичной. Поэтому если в десятичной арифметике единицу более старшего разряда даёт, к примеру, сложение 1 и 9, то в двоичной арифметике её даст сложение 1 и 1. То есть

(в десятичной системе это равенство выглядит как 1+1=2). Аналогично,

, и так далее.

Примеры сложения “в столбик”:

Совершенно аналогично выполняется умножение:

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

Двоичное представление отрицательных целых чисел. Дополнительный код

Старший бит в целых без знака имеет обычный смысл, в целых со знаком – для положительных чисел всегда равен 0. В отрицательных числах старший бит всегда равен 1. В примерах для простоты мы будем рассматривать четырехбитную арифметику. Тогда в качестве примера целого положительного числа можно привести 01102.

Для хранения отрицательных чисел используется дополнительный код. Число (– n), где n положительно, переводится в число n2=-n по следующему алгоритму:

· этап 1: сначала число n преобразуется в число n1 путём преобразования

, во время которого все единицы числа n заменяются нулями, а нули единицами, то есть
;

· этап 2: перевод

, то есть к получившемуся числу n1 добавляется единица младшего разряда.

Надо отметить, что дополнительный код отрицательных чисел зависит от разрядности. Например, код числа (–1) в четырёхразрядной арифметике будет

, а в 8-разрядной арифметике будет
. Коды числа (–2) будут
и
, и так далее.

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

Сложение положительного и отрицательного чисел

Рассмотрим, чему равна сумма числа 1 и числа –1, представленного в дополнительном коде. Сначала переведём в дополнительный код число –1. При этом n=110, n2= –110.

Этап1: n=110=00012

n1=11102;

Этап2: n2=11102+1=11112;

Таким образом, в четырёхбитном представлении –110=11112.

Проверка:

n2+n=100002. Получившийся пятый разряд, выходящий за пределы четырехбитной ячейки, отбрасывается, поэтому в рамках четырехбитной арифметики получается n2+n=00002=0.

Аналогично

n=210=00102

n1=11012; n2=11102;

n=310=00112

n1=11002; n2=11012;

n=410=01002

n1=10112; n2=11002;

Очевидно, во всех этих случаях n2+n=0.

Что будет, если мы сложим 310 и –210 (равное 11102, как мы уже знаем)?

После отбрасывания старшего бита, выходящего за пределы нашей четырёхбитовой ячейки, получаем 00112 + 11102=00012, то есть 310 + (–210)=110, как и должно быть.

Сложение отрицательных чисел

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

Вычитание положительных чисел осуществляется путём сложения положительного числа с отрицательным, получившимся из вычитаемого в результате его перевода в дополнительный код.

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

Проблемы целочисленной машинной арифметики

Несмотря на достоинства в двоичной машинной (аппаратной) арифметике имеются очень неприятные особенности, возникающие из-за конечной разрядности машинной ячейки.

Проблемы сложения положительных чисел

Пусть a=310=00112; b=210=00102; a+b=01012=510, то есть все в порядке.

Пусть теперь a=610=01102, b=510=01012. Тогда a+b =10112= -32.

То есть сложение двух положительных чисел может дать отрицательное, если результат сложения превышает максимальное положительное число, выделяемое под целое со знаком для данной разрядности ячеек! В любом случае при выходе за разрешённый диапазон значений результат оказывается неверным.

Если у нас беззнаковые целые, проблема остается в несколько измененном виде. Сложим 810+810 в двоичном представлении. Поскольку 810=10002, тогда 810+810= 10002+ 10002=100002. Но лишний бит отбрасывается, и получаем 0. Аналогично в четырёхбитной арифметике, 810+ 910=110, и т.д.