Опубликован: 04.12.2009 | Доступ: свободный | Студентов: 8416 / 657 | Оценка: 4.30 / 3.87 | Длительность: 27:27:00
Лекция 4:

Работа с числами в языке Java

< Лекция 3 || Лекция 4: 12345 || Лекция 5 >
Аннотация: Двоичное представление целых чисел. Позиционные и непозиционные системы счисления. Двоичное представление положительных целых чисел. Двоичное представление отрицательных целых чисел. Дополнительный код. Проблемы целочисленной машинной арифметики. Шестнадцатеричное представление целых чисел и перевод из одной системы счисления в другую. Побитовые маски и сдвиги. Двоичное представление вещественных чисел. Двоичные дроби. Мантисса и порядок числа. Стандарт IEEE 754 представления чисел в формате с плавающей точкой.

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

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

Позиционные и непозиционные системы счисления

Позиционная система счисления - это такой способ записи числа, при котором вес цифры зависит от занимаемой позиции и пропорционален степени некоторого числа. Основание степени называется основанием системы счисления.

Например, число 2006 в десятичной системе счисления представляется в виде суммы тысяч, сотен, десятков и единиц:

2006 = 2*10^3 + 0*10^2 + 0*10^1 + 6*10^0 ,

то есть слагаемых с различными степенями числа 10. По основанию степени - числу десять - система называется десятичной. Другие позиционные системы счисления отличаются только числом в основании степени.

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

Таблица 4.1.
0,1 - цифры двоичной системы
0,1,2,3,4,5,6,7 - цифры восьмеричной системы
0,1,2,3,4,5,6,7,8,9 - цифры десятичной системы
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F - цифры шестнадцатеричной системы

В шестнадцатеричной системе "обычных" десятичных цифр недостаточно, и для обозначения цифр, больших девяти, используются заглавные латинские буквы A,B,C,D,E,F.

В дальнейшем везде, где это необходимо, мы будем указывать основание системы счисления индексом рядом с числом: 95_{10} - в десятичной системе, 27F_{16} - в шестнадцатеричной системе, 6752_8 - в восьмеричной системе, 1000111_2 - в двоичной системе.

Существует множество непозиционных систем счисления, в которых числа изображаются и называются по своим правилам. Для римской системы чисел характерны сопоставление отдельного знака каждому большому числу ( V - пять, X - десять, L - пятьдесят, C - сто, M - тысяча ), повторение знака столько раз, сколько таких чисел во всем числе ( III - три, XX - двадцать), отдельные правила для предшествующих и последующих чисел (IV - четыре, VI - шесть, IX - девять). Множество непозиционных систем счисления связано с традиционными способами измерения конкретных величин - времени ( секунда, минута, час, сутки, неделя, месяц, год), длины ( дюйм, фут, ярд, миля, аршин, сажень), массы ( унция, фунт), денежных единиц. Выполнение арифметических действий в таких системах представляет собой крайне сложную задачу.

Приведем пример самой простой из возможных систем счисления – унарную. В ней имеется всего одна цифра 1. В унарной системе счисления число 1 изображается как 1, число 2 изображается как 11, число 3 как 111, число 4 как 1111, и так далее. Первоначально вместо единицы использовались палочки (помните детский сад?), поэтому такая система счисления иногда называется палочковой. Как ни странно, она является позиционной.

Позиционные системы счисления с основанием 2 и более удобны для алгоритмизации математических операций с числами (вспомните способ сложения и умножения "столбиком"). Двоичная система является естественным способом кодирования информации в компьютере, когда сообщение представляется набором нулей ("0" - нет сигнала на линии) и единиц ("1" - есть сигнал на линии). Для обозначения двоичных цифр применяется термин "бит", являющийся сокращением английского словосочетания "двоичная цифра" (BInary digiT).

Архитектура компьютера накладывает существенное ограничение на длину информации, обрабатываемой за одну операцию. Эта длина измеряется количеством двоичных разрядов и называется разрядностью. С помощью восьми двоичных разрядов можно представить 2^8=256 целых чисел. Порция информации размером 8 бит (8-ми битовое число) служит основной единицей измерения компьютерной информации и называется байтом (byte). Как правило, передача информации внутри компьютера и между компьютерами идет порциями, кратными целому числу байт.

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

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

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

Целые числа в компьютере обычно кодируются в двоичном коде, то есть в двоичной системе счисления. Например, число 5 можно представить в виде 5=1\cdot2^2+0\cdot2^1+1\cdot2^0=101_2.

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

Аналогично, 6=1\cdot2^2+1\cdot2^1+0\cdot2^0=110_2,\; 2=10_2,\; 4=100_2,\; 8=1000_2,\; 9=1001_2, и так далее. Все очень похоже на обозначение чисел в десятичной системе счисления:

153=1\cdot10^2+5\cdot10^1+3\cdot10^0. Но только в качестве основания системы счисления используется число 2=10_2. У чисел, записанных в десятичной системе счисления, индекс 10 обычно не пишется, но его можно писать. Так что 2=2_{10},\; 10=10_{10}, и так далее.

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

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

Целочисленное деление на 10_2 с отбрасыванием остатка производится путем отбрасывания последнего (младшего) бита, деление на 100_2 - отбрасывания двух последних бит, и так далее. Обычно такие операции называют побитовыми сдвигами на n бит влево (умножение на 2^n ) или вправо (целочисленное деление на 2^n ).

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

1_2+1_2=10_2

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

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

\frac{+\substack{0110_2\\ 1011_2}}{10001_2}\quad \frac{+\substack{1100_2\\ 0010_2}}{1110_2}\quad \frac{+\substack{111_2\\ 001_2}}{1000_2}

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

\cfrac{\;\;\;\;\;\times\substack{101_2\\ \;11_2}}{\cfrac{+\substack{\;\;\;101\\101}}{\;\;\;\;\;\;1111_2}}

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

< Лекция 3 || Лекция 4: 12345 || Лекция 5 >
Полетаев Дмитрий
Полетаев Дмитрий
Не очень понятно про оболочечные Данные,ячейки памяти могут наверно размер менять,какое это значение те же операции только ячейки больше,по скорости тоже самое
Максим Старостин
Максим Старостин

Код с перемещением фигур не стирает старую фигуру, а просто рисует новую в новом месте. Точку, круг.