Десятичные, двоичные и шестнадцатеричные числа
В повседневной жизни человек имеет дела с десятичными числами. В десятичной системе счисления для представления чисел используются цифры от 0 до 9. Значение числа определяется как сумма произведений цифр числа на их весовые коэффициенты, определяемые местами цифр в числе. Весовой коэффициент самой правой цифры равен единице, цифры перед ней — десяти, затем ста и т. д. Например, число 2703 равно 2 х 1000 + 7 х 100 + + 0 х 10 + 3 х 1.
Если места цифр (разряды) пронумеровать справа налево и самой правой позиции присвоить номер ноль, то можно заметить, что вес /-ого разряда равен йй степени десятки (рис. П1).
Рис. П1. Вес разрядов в десятичной системе счисления
Для внутреннего представления чисел в компьютере используется двоичная система счисления. Двоичные числа записываются при помощи двух цифр — нуля и единицы. Как и десятичная, двоичная система — позиционная. Весовой коэффициент разряда /-го равен двум в i-й степени (рис. П2).
Двоичные числа наиболее точно отражают состояние памяти, регистров процессора и внешних устройств компьютера. Вместе с тем, работать с двоичными числами не совсем удобно — слишком много цифр приходится записывать. Поэтому была разработана шестнадцатеричная система счисления и записи чисел, позволяющая компактно записывать двоичные числа и обеспечивающая простой способ перевода двоичного числа в шестнадцатеричное и обратно.
Рис. П2. Вес разрядов в двоичной системе счисления
В основе шестнадцатеричной системы счисления лежит тот факт, что, используя четыре двоичные цифры, можно записать шестнадцать чисел (максимальное значение четырехразрядного двоичного числа равно пятнадцати).
Шестнадцатеричное число получается из двоичного следующим образом (рис. ПЗ).
Цифры двоичного числа делятся на группы по четыре. Каждой группе ставится в соответствие сначала десятичное число, являющееся десятичным эквивалентом четырехзначного двоичного, затем полученное десятичное число записывается шестнадцатеричной цифрой. В табл. Ш приведены десятичные числа от нуля до 15 и соответствующие им шестнадцатеричные цифры.
Рис. ПЗ. Перевод двоичного числа в шестнадцатеричное
Таблица П1. Перевод десятичных чисел в шестнадцатеричные
Десятичное число
Шестнадцатеричная цифра
0
0
1
1
2
2
3
з
4
4
5
5
6
6
7
7
8
8
9
9
10
А
11
В
12
С
13
D
14
Е
15
F
В тексте программы первая цифра шестнадцатеричного числа предваряется символами Ох. Вот примеры шестнадцатеричных чисел: 0х2А, OxFF, 0x01.
Память компьютера
В памяти компьютера числа хранятся в виде битов. Каждый бит может принимать значение одной двоичной цифры. Следовательно, значением бита может быть ноль или единица. Восемь битов объединены в байт. Максимальное число, которое можно записать при помощи восьми двоичных цифр, — это 11111111, что соответствует десятичному числу 255, минимальное — ноль. Поэтому, значением байта может быть число от нуля до 255.
Переменные хранятся в памяти. Так как переменные различных типов могут принимать различные значения, то для их хранения нужен разный объем памяти. Память под переменные выделяется в байтах (целое число). Например, значением переменной типа char может быть любой из 256 символов. Поэтому для хранения переменной такого типа достаточно одного байта. Значением переменной типа integer может быть число от —32 768 до 32 767 (65 535 значений). Для хранения переменной этого типа требуется два байта. Очевидно, что чем больше диапазон значений типа, тем больше байтов нужно для хранения переменной этого типа:
В программе для одного и того же значения можно использовать переменные разного типа (при этом они будут занимать разный объем памяти). Например, если в программе используется переменная Day (число месяца), то для нее можно задать типы byte, integer или longint. В первом случае будет занят один байт памяти, во втором — два, в третьем — четыре. Однако реально будет использоваться только один байт, а остальные — просто заняты. Поэтому следует подбирать наиболее подходящий тип для каждой переменной. Особое внимание нужно обращать на описание строковых переменных и массивов.
Выделяя память для строковых переменных, помните, что если не указана предельная длина строки, то переменной выделяется 256 байтов. При объявлении переменной, предназначенной, например, для хранения имени человека, следует писать
name:string!30], а не name:string.
Каждому массиву программы выделяется память, объем которой определяется как типом элементов массива, так и их количеством. Например, для хранения двумерного массива вещественных чисел (например, 20x20) нужно более трех килобайт памяти (20x20x8 = 3200).
Хотя объем памяти компьютера кажется неограниченным, но если ее нерационально использовать, то в один прекрасный момент памяти может не хватить.
Таблица кодировки символов
Символы с кодами 0—127.
Символы с кодами 128—255.
Символы с кодами 7, 8, 10 и 13 являются служебными и на экране не отображаются. Каждому служебному символу соответствует определенное действие.
Вывод иллюстраций
В языке Turbo Pascal нет стандартной процедуры, которая обеспечивала бы вывод на экран картинки, находящейся в файле. Программист сам может разработать такую процедуру. Однако эта задача является довольно сложной. Поэтому ниже приведен текст разработанной автором функции Draw, которая выводит на экран 16-цветную картинку, созданную в среде Windows, например, при помощи графического редактора Paint.
( (с) Культин Н. Б., 2000 }
{ Выводит 16-цветную картинку, содержимое bmp-файла }
function Draw(x0,y0: integer; fname: string;
transparent: boolean ):integer; { xO,yO - координаты левого верхнего угла
области вывода; fname — имя файла картинки; transparent = True — не выводить точки,
цвет которых совпадает с цветом левой нижней точки картинки. Значения функции:
успех — высота картинки в пикселах; -1 — не найден файл; -2 — картинка не является 16-цветной.
label
bye;
const
{ таблица преобразования кодировки цвета из Windows в DOS } color: array[0..15] of byte = (0,4,2,6,1,5,3,7,8,12,10,
14,9,13,11,15);
type
{ Прочитав из bmp-файла эту запись, можно получить информацию о находящейся в этом файле картинке: размере и кол-ве цветов. } bmpinfo = record
{ файл должен начинаться буквами ВМ }
( размер файла, байт }
{ резерв, не используется }
( смещение данных относительно
начала файла } { не используется } { ширина картинки } { высота картинки }
{ кол-во планов, должно содержать 1 } { кол-во битов на пиксел (1, 4, 8 или 24 }
hl,h2:
Size:
Reserved:
Offset:
b:
Width: Height: Plans: bpp:
char; longint; longint; longint;
longint;
longint;
longint;
word;
word;
end;
f: file of bmpinfo; bmpf: file of byte; res: integer;
{ для получения информации о картинке }
{ для чтения картинки }
{ код ошибки открытия файла }
info: bmpinfo;
х,у:integer; { координаты пиксела }
b: byte; { байт, прочитанный из файла }
bh: byte; { сдвинутые на четыре разряда четыре
старшие бита прочитанного байта } Ы: byte; { четыре младшие бита прочитанного байта }
nb: integer; { кол-во байт (кратное четырем)
соответствующее строке } np: integer; { кол-во выведенных пикселов строки }
tpcolor: byte; { "прозрачный" цвет. Закрашенные этим цветом точки картинки на экран
не выводятся
i,j : integer;
begin
assign(f,fname);
{$1-}
reset(f);
{$1+}
res:=IOResult;
if res <> 0 then
begin
Draw:=-1; { не найден файл картинки }
goto bye; end;
read(f,info); { читаем информацию о картинке } close(f); { и закрываем файл }
if info.bpp <> 4 then begin
Draw:=-2; { картинка не 16-цветная }
goto bye; end;
x:=xO;
у:=yO+infо.height;
nb: = (info.width div 8)*4;
if (info.width mod 8) <> 0 then nb:=nb+4;
assign(bmpf,fname);
reset (bmpf) ;
seek(bmpf,info.offset);
if transparent then begin
read (bmpf, b) ;
tpcolor:=b shr 4;
seek(bmpf,info.offset); end
else tpcolor := 17; { в качестве прозрачного зададим
несуществующий цвет }
for i:=l to info.height do begin
np:=0; {кол-во выведенных пикселов }
246 Turbo Pascal в задачах и примерах
for j:=l to nb do { вывод строки }
begin
¦ II { if not EOF(bmpf) then }
read (bmpf, b) ;
1 if np < info.width then
begin
1 bh:= b shr 4;
if bh <> tpcolor
then putpixel(x,y,color[bh]);
inc(x);
inc(np);
end;
if np < info.width then
begin
bl:= b and 15;
II if bl <> tpcolor
then putpixel (x, y, color [Ы]);
inc(x);
inc(np);
end;
end;
x:=xO;
dec(y);
end;
close(bmpf);
Draw := info.height;
bye:
end;