Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


ѕростые типы данных. ќперации над простыми данными




Ќад простыми типами данных обычно не задумываютс€. ѕросто используют в своих программах целые и вещественные числа, символы, биты... ћежду тем, профессионал должен знать форматы представлени€ данных. Ќе только сложных структур, но и элементарных данных. »менно с ними работает процессор, и от правильного выбора может зависеть очень многое. ‘орматам данных вообще, и простым в частности, удел€етс€ мало внимани€.  ак результат, множество вопросов возникающих у начинающих программистов. » не только у них. ѕопытка написать программу, работающую с аппаратурой или обрабатывающую графику, может поставить в тупик даже опытного программиста, привыкшего писать чисто прикладные программы (например на VB).

ѕопытаюсь заполнить этот пробел. ќсновной упор будет сделан на форматы данных использующиес€ в процессорах Intel (AMD), т.е. в IBM совместимых компьютерах. ѕри этом предполагаетс€, что читатель знаком, по крайней мере, с системами счислени€. ƒес€тичной (ну это все знают), двоичной и шестнадцатиричной.

ћашинные форматы данных.

Ѕит.

Ѕит - это наименьша€ представима€ порци€ информаци. —только ее содержитс€ в ответе "ƒј" или "Ќ≈“". Ѕит может иметь только два значени€: 0 или 1. Ѕит не может быть знаковым или беззнаковым. ќднако можно выполнить любые вычислени€ опериру€ только битами. “ак работают последовательные процессоры. “ак выполн€ютс€ вычислени€ с большой точностью. Ќа обработке битов основаны методы вычислений, получившие обобщенное название "цифра за цифрой". », разумеетс€, из битов состо€т все остальные типы данных.

ќперации с битами. — битами можно выполн€ть не так уж и много операций:

Ј ”становка (SET) и сброс (RESET). ‘актически это операции присваивани€. ”становка присваивает биту значение 1, сброс - значение 0.

Ј ѕроверка (TEST). ѕо другому, чтение бита, или получение значени€. ¬ыделена мной потому, что биты часто используютс€ дл€ представлени€ условий в программе. ќтсюда и такое странное, на первый взгл€д, название операции.

Ј ќпераци€ Ќ≈ (NOT). ћен€ет значение бита на противоположное, т.е.

NOT   =  
NOT   =  

Ј ќпераци€ » (AND). ¬ыполн€етс€ над двум€ битами.

  AND   =  
  AND   =  
  AND   =  
  AND   =  

Ј ќпераци€ »Ћ» (OR). ¬ыполн€етс€ над двум€ битами.

  OR   =  
  OR   =  
  OR   =  
  OR   =  

Ј ќпераци€ »— Ћё„јёў≈≈ »Ћ» (XOR). ¬ыполн€етс€ над двум€ битами. Ёту операцию часто используют дл€ контрол€ четности и вычислени€ контрольных сумм.

  XOR   =  
  XOR   =  
  XOR   =  
  XOR   =  

Ј ќпераци€ ¬«я“»≈ ѕќ ћќƒ”Ћё 2 (M2). ¬ыполн€етс€ над двум€ битами. явл€етс€ инверсией операции »— Ћё„јёў≈≈ »Ћ». Ёту операцию так же часто используют дл€ контрол€ четности и вычислени€ контрольных сумм. ќбратите внимание, результат операции »— Ћё„јёў≈≈ »Ћ» равен единице, когда биты имеют разные значени€. –езультат операции ¬«я“»≈ ѕќ ћќƒ”Ћё 2 равен единице, когда биты имеют одинаковые значени€. Ёто очень важное отличие.

  M2   =  
  M2   =  
  M2   =  
  M2   =  

Ѕайт.

Ѕайт, собственно это набор бит, обычно это восемь бит. ќднако может быть и 5 бит, и 6, и 7, и даже 9. Ќе надо этому удивл€тьс€. »значально, термин байт возник как название набора бит, достаточных дл€ представлени€ одного символа, или кванта информации, обрабатываемой процессором за один такт. ¬ телеграфии обмен идет п€ти-битными символами, в этом может убедитьс€ каждый посмотрев на перфоленту телеграфного аппарата (телетайпа). —ледовательно этот байт состоит из 5 бит. ¬ оперативной пам€ти компьютеров часто используетс€ хранение информации в виде, позвол€ющем обнаруживать и исправл€ть ошибки. ƒл€ этого просто добавл€ют вспомогательные разр€ды. Ќапример, одного разр€да достаточно дл€ обнаружени€ одиночной ошибки. ѕолучаем, что байт в процессоре, состо€щий из восьми бит, в пам€ти состоит из дев€ти. ѕри записи информации на жесткие диски добавл€ют не один, а несколько бит. Ёто делаетс€ дл€ восстановлени€ информации при возможных сбо€х. “ак что не следует считать, что байт всегда 8 бит. ’от€, дл€ наших целей, мы примем размер байта именно 8 бит. Ќас ведь интересуют не способы контрол€ и восстановлени€ информации.

‘ормат представлени€ байта показан на рисунке 1. —тарший значащий бит еще называют MSB, а младший LSB. –исунок знакового байта может вызвать вопросы. ƒело в том, что старшим значащим битом, в этом случае, все равно €вл€етс€ самый левый бит, а у нас показан второй слева. Ёто с точки зрени€ процессора, с точки зрени€ программиста, в знаковом байте, дл€ представлени€ числа можно использовать не 8, а только 7 разр€дов. ѕоэтому, с точки зрени€ программиста, старшим значащим битом €вл€етс€ именно показаный. ¬осьмой же бит €вл€етс€ знаковым, т.е. индицирует знак хранимого в байте числа. ≈диничное значение этого разр€да, обычно, соответствует отрицательному числу, а нулевое - положительному.

ƒл€ представлени€ отрицательных чисел может использоватьс€ два метода. ѕервый - знаковый бит используетс€ дл€ индикации знака, остальные р€зр€ды дл€ представлени€ числа в пр€мом коде. ¬торой - знаковый бит используетс€ дл€ индикации знака, остальные разр€ды дл€ представлени€ числа в дополнительном коде. Ќа первый взгл€д, различие не большое. ќднако давайте рассмотрим два числа, 00000000 и 10000000. ≈сли отрицательные числа хран€тс€ в пр€мом коде, то оба эти числа €вл€ютс€ 0. Ќо! ѕервое это положительный 0, второе отрицательный! Ёту проблему вы наверно уже встречали, по крайней мере в старых книгах по вычислительной технике. Ќо это не единственна€ проблема пр€мого представлени€ отрицательных чисел. ѕопробуем сложить плюс 1 и минус 1, 00000001 + 10000001. ѕростое сложение даст 10000010, а это отнюдь не 0. «начит нужна коррекци€ результата, а это удорожает оборудование. ѕоэтому в современных процессорах, за редким исключением, отрицательные числа представлены в дополнительном коде. ¬ дополнительном коде отрицательное число представл€етс€ как число, которое надо прибавить к хран€щемус€ дл€ получени€ в результате 0. «вучит туманно? Ќа самом деле все просто, возьмем число 11111111, дл€ получени€ 0, к этому числу надо прибавить 1. ѕри этом произойдет перенос из старшего разр€да и получитс€ 00000000. —ледовательно, 11111111 это -1. ¬ообще смена знака чисела в дополнительном коде выполн€етс€ так: исходное число инвертируетс€ и к результату прибавл€етс€ единица. Ќет никаких сложностей и со сложением, 11111111 + 00000001 = 00000000. Ќе требуетс€ усложнение оборудовани€.

“еперь разберемс€ с проблемой пор€дка бит в байте. —уть такова, хранитьс€ в машинной пам€ти, и передаватьс€ по последовательным каналам св€зи, байт может как со стороны старшего бита, так и со стороны младшего. Ќа самом деле проблемы не существует. ѕрограммист имеет дело с представлением байта в процессора, перестановкой бит занимаетс€ оборудование. ƒругое дело, пор€док байт в слове, но об этом позже.

“еперь о диапазоне значений чисел, хран€щихс€ в байтах. Ѕеззнаковый байт позвол€ет хранить числа от 0 до 255. Ѕайт со знаком позвол€ет хранить числа от -128 до +127.

ќперации с байтами. ќпераций с байтами гораздо больше, чем операций с битами. ќперацию присваивани€ рассматривать не будем, поскольку она очевидна. Ќе будем рассматривать и операции возведени€ в степень, извлечение корн€, тригонометрические операции и тому подобное. ƒело в том, что все эти операции, в конечном итоге, распадаютс€ на простые арифметические операции и сдвиги. »нтересующихс€ подробност€ми отсылаю к книгам по высшей математике и численым методам.

Ј ќпераци€ »Ќ¬≈–—»я Ѕј…“ј (NOT). ѕо другому это называетс€ операци€ Ќ≈. Ќад каждым битом байта выполн€етс€ операци€ Ќ≈. —ледует заметить, что эта операци€ не €вл€етс€ операцией смены знака числа, хот€ и мен€ет значение знакового разр€да. «нак числа (знакового байта) мен€етс€ операцией двоичного дополнени€. ≈сли вы не можете уловить разницу, прочтите еще раз повнимательней параграф о форматах представлени€ отрицательных чисел.

NOT 01100100 = 10011011

Ј ќпераци€ ƒ¬ќ»„Ќќ≈ ƒќѕќЋЌ≈Ќ»≈ (NEG) мен€ет знак числа. ƒелаетс€ это просто: выполн€етс€ инверси€ байта, а затем к байту прибавл€етс€ единица. ≈ще раз обращаю ¬аше внимание на различие этих двух операций, дополнени€ и инверсии.  ак показывает практика, это €вл€етс€ камнем преткновени€ дл€ многих. »нверси€ имеет смысл дл€ беззнаковых байтов, а дополнение мен€ет знак числа хран€щегос€ в знаковом байте.

NEG 01100100 = 10011100

Ј ќпераци€ ѕќ–ј«–яƒЌќ√ќ Ћќ√»„≈— ќ√ќ » (AND) выполн€етс€ над двум€ байтами. –езультатом операции €вл€етс€ байт, в котором каждый бит €вл€етс€ результатом операции » соответствующих бит исходных байтов. ќпераци€ имеет смысл дл€ беззнаковых байтов. “очнее, процессору все равно, знаковый или беззнаковый байт участвует в операции, но ¬ам, как программистам, это €вно не все равно.

01100100 AND 10011101 = 00000100

Ј ќпераци€ ѕќ–ј«–яƒЌќ√ќ Ћќ√»„≈— ќ√ќ »Ћ» (OR) выполн€етс€ над двум€ байтами. јналогична операции », за исключением того, что над битами выполн€етс€ операци€ »Ћ». »меет смысл дл€ беззнаковых байтов.

01100100 OR 10011101 = 11111101

Ј ќпераци€ ѕќ–ј«–яƒЌќ√ќ »— Ћё„јёў≈√ќ »Ћ» (XOR) выполн€етс€ над двум€ байтами. јналогична операции », за исключением того, что над битами выполн€етс€ операци€ »— Ћё„јёў≈√ќ »Ћ». »меет смысл дл€ беззнаковых байтов.

01100100 XOR 10011101 = 11111001

Ј ќпераци€ ѕќ–ј«–яƒЌќ√ќ ¬«я“»я ѕќ ћќƒ”Ћё 2 (M2) выполн€етс€ над двум€ байтами. јналогична операции », за исключением того, что над битами выполн€етс€ операци€ ¬«я“»я ѕќ ћќƒ”Ћё 2. »меет смысл дл€ беззнаковых байтов.

01100100 XOR 10011101 = 00000110

Ј ќпераци€ —Ћќ∆≈Ќ»я (ADD) выполн€етс€ над двум€ байтами. —ложение выполн€етс€ точно так же, как мы складываем дес€тичные числа, начина€ с младшего разр€да и заканчива€ старшим. “очно так же выполн€ютс€ и междуразр€дные переносы. ѕравила сложени€ бит следующие:

  +   =  
  +   =  
  +   =  
  +   =  

Ј ќднако, в отличии от привычной нам всем математики, где количество цифр в получившейс€ сумме нам, в общем и целом, безразлично, при сложении байтов дело обстоит не так просто. –ечь идет о ситуации, когда число разр€дов в результате операции превышает размер байта. ¬ нашем случае, это более 8 бит дл€ байта без знака, и более 7 бит дл€ байта со знаком. “ут то и по€вл€ютс€ термины перенос и переполнение. ƒл€ индикации этих ситуаций, в слове состо€ни€ процессора, обычно предусматриваютс€ специальные биты. Ѕит индицирующий перенос, обычно, обозначаетс€ — или CF, а переполнение ќ или OF. ѕопробуем разобратьс€ поподробнее. –ассмотрим пример сложени€ двух беззнаковых байт:

Ј  ак видно, результат занимает 9 бит. Ётот дев€тый бит, не помещающийс€ в байте, и называетс€ переносом. —читать ли данную ситуацию ошибочной? » да и нет. ≈сли результат должен помещатьс€ в байт, то это безусловно ошибка. ≈сли же это часть операции сложени€ многобайтных чисел, то ошибки нет. ѕеренос, как результат сложени€, имеет точно такое же значение, что и поразр€дные переносы при выполнении сложени€. ќн не €вл€етс€ признаком ошибки и используетс€ при организации сложени€ многобайтных чисел. »так, термин перенос имеет смысл дл€ беззнаковых байт. ќн не €вл€етс€ ошибкой при сложении двух байт, €вл€ющихс€ частью многобайтных чисел. ¬ противном случае он сигнализирует об ошибке.

Ј “еперь разберемс€ с переполнением. –ассмотрим пример сложени€ знаковых байт.

Ј Ќа первый взгл€д все в пор€дке. ¬ результате 8 разр€дов, следовательно он помещаетс€ в байт. Ќо вспомним, мы складываем знаковые байты. ” нас же, при сложении двух положительных чисел, получилс€ отрицательный результат! ѕереполнение возникает, когда при сложении двух знаковых байт, имеющих одинаковый знак, результат сложени€ имеет другой знак. »ногда переполнение можно игнорировать, но в большинстве случаев это свидетельствует об ошибке. ѕо научному, условие формировани€ переполнени€ звучит так: количество переносов в знаковый разр€д не равно количеству переносов из знакового разр€да. »так, термин переполнение имеет смысл дл€ знаковых байт. ¬ большинстве случаев это свидетельствует об ошибке.

Ј ќпераци€ ¬џ„»“јЌ»я (SUB) выполн€етс€ над двум€ байтами.  ак и операци€ сложени€, операци€ вычитани€ очень похожа на вычитание обычных дес€тичных чисел. “очно так же, как и при обычном вычитании, формируютс€ междуразр€дные заемы.  ак и в операции сложени€, могут быть сформированы признаки заема, как результата операции, и переполнени€. Ќаучна€ формулировка услови€ формировани€ переполнени€ звучит точно так же, как и дл€ сложени€. ј вот как сказать это более человеческим €зыком, € оставл€ю ¬ам в качестве упражнени€.

ѕоскольку € так много и подробно написал про сложение, буду кратким. —обственно, вычитание реализуетс€ очень просто. ” вычитаемого мен€етс€ знак, дл€ чего выполн€етс€ операци€ NEG. «атем выполн€етс€ сложение. Ёто чуть медленее, чем просто вычитание, но не требует усложнени€ процессора. ѕри вычитании, вместо термина перенос, примен€етс€ термин заем. “ермин переполнение сохран€ет свое значение. “еперь небольшой пример:

Ј ќпераци€ »Ќ –≈ћ≈Ќ“ј (INC). ѕросто увеличение байта на 1. Ёто настолько часта€ операци€, что во всех современных процессорах дл€ нее имеетс€ специальна€ команда.

Ј ќпераци€ ƒ≈ –≈ћ≈Ќ“ј (DEC). ѕросто уменьшение байта на 1. Ёто настолько часта€ операци€, что во всех современных процессорах дл€ нее имеетс€ специальна€ команда.

Ј ќпераци€ ”ћЌќ∆≈Ќ»я (MUL) выполн€етс€ над двум€ байтами. јналогична операции умножени€ дес€тичных чисел. ѕравила умножени€ бит следующие:

  х   =  
  х   =  
  х   =  
  х   =  

Ј ”множение, как и деление впрочем, имеет несколько особенностей. ѕерва€, это то, что умножение (и деление) бывает знаковым и беззнаковым.  ак ¬ы уже наверно догадались, при выполнении знакового умножени€ знаковые биты перемножаемых байт не участвуют в операции собственно умножени€, а определ€ют знак результата. ¬ операции беззнакового умножени€ участвуют, на равных, все биты перемножаемых байт. ¬торое отличие - результат умножени€ имеет в два раза больше бит, чем сомножители. “о есть при умножении двух восьмибитных байт результат будет иметь 16 бит. ѕриведу пример:

Ј —амый левый бит, п€тнадцатый, в нашем случае равен 0. ћожет возникнуть вопрос, зачем тогда его показывать? ¬спомним сложение. Ётот бит может запросто оказатьс€ не нулевым в результате переноса. »так, в результате умножени€ двух однобайтных сомножителей мы получили два байта, которые можно назвать словом или полусловом. Ќо эти термины мы обсудим позже. ј сейчас попытаемс€ разобратьс€ с переполнением и переносом при умножении.

Ј ѕри обсуждении переноса и переполнени€ при умножении € должен сделать одну очень важную оговорку. –ечь будет идти о процессорах INTEL 80х86. ƒело в том, что установка признаков результата, и даже количество бит в результате (8 или 16), очень сильно зависит от конкретного процессора. ¬ процессорах Intel 80х86, при умножении двух байт, будет получатьс€ 16-ти разр€дный результат, который состоит из двух половин, младшей и старшей. ƒл€ нашего примера младша€ половина 01110010, а старша€ 00110110. ƒл€ беззнакового умножени€ признаки CF и OF будут устанавливатьс€, если старша€ половина результата не нулева€. ƒл€ знакового умножени€ признаки CF и OF будут установлены, если старша€ половина результата не равна 00000000 или 11111111. ѕочему такое странное условие дл€ знакового умножени€? Ќаберитесь терпени€, это будет описано в следующем разделе. —читать ли установку признаков переноса и переполнени€ ошибкой? ƒа, если результат должен помещатьс€ в байте. ¬ противном случае это просто говорит о том, что старша€ половина результата содержит значащие разр€ды.

Ј ќпераци€ ƒ≈Ћ≈Ќ»я (DIV) выполн€етс€ над двум€ байтами.  ак и все ранее рассмотренные операции, деление байт аналогично привычному делению дес€тичных чисел. ќсновное отличие состоит в том, что делимое должно занимать два байта, а не один. „то же делать, если нужно разделить именно байт? ≈сли делимое беззнаковый байт, то его размещают на месте младшей половины делимого, а в старшую занос€т 0. ≈сли делимое знаковый байт, то выполн€ют расширение знака. ƒл€ этого в старшую половину делимого занос€т 00000000, если делимое положительно, или 11111111, если делимое отрицательно. “о есть, устанавливают все биты старшей половины делимого равными значению знакового бита младшей половины делимого. ¬спомните условие формировани€ признаков CF и OF при выполнении знакового умножени€, теперь оно должно быть пон€тным дл€ ¬ас.  ак и умножение, деление может быть знаковым и беззнаковым. ѕриведу пример:

ќбратите внимание, что результат делени€ занимает 9 бит. ѕравда дев€тый бит нулевой, и это важно. ѕри реализации операции делени€ разработчики процессоров Intel 80х86 отошли от привычной схемы формировани€ признаков результата. ѕосле выполнени€ делени€ ни призак CF, ни признак OF не имеют смысла и могут принимать любое значение. ≈сли результат делени€ двух байт не помещаетс€ в байт, то есть, если в результате есть ненулевые биты, кроме младших восьми, то выполн€етс€ прерывание. ѕрерывани€ будут описаны в отдельной статье, сейчас ¬ам просто надо запомнить, что после операции делени€ признаки результата не определены, что вызывает дополнительные сложности.

“еперь обратим внимание, что наше делимое не поделилось на делитель нацело. ¬ остатке 100. Ёто обычное €вление.  ак и в привычной всем дес€тичной арифметике, результатом делени€ €вл€ютс€ частное и остаток. ѕри этом, никаких признаков не нулевого остатка не формируетс€. ¬ы должны провер€ть это сами.

Ј ќперации Ћќ√»„≈— ќ√ќ —ƒ¬»√ј ¬ѕ–ј¬ќ (SHR) и Ћќ√»„≈— ќ√ќ —ƒ¬»√ј ¬Ћ≈¬ќ (SHL). »меют смысл дл€ беззнаковых байт. ѕри этом сдвиг влево, фактически, выполн€ет умножение на 2, а сдвиг вправо, деление на 2 (с отбрасыванием остатка).

“ак из байта 01101001 (дес€тичное 105), в результате логического сдвига вправо, получитс€ байт 00110100 (дес€тичное 52), а в результате сдвига влево 11010010 (дес€тичное 210). ќбратите внимание на необычное использование признака CF, он содержит значение последнего выдвигаемого бита. »менно последнего, поскольку сдвиг может выполн€тьс€ не на один бит, или по другому разр€д, а сразу на несколько.  стати, признаки результата, в частности CF, по другому называютс€ флажками.

Ј ќперации ј–»‘ћ≈“»„≈— ќ√ќ —ƒ¬»√ј ¬ѕ–ј¬ќ (SAR) и ј–»‘ћ≈“»„≈— ќ√ќ —ƒ¬»√ј ¬Ћ≈¬ќ (SAL). »меют смысл дл€ знаковых байт. јналогичны операци€м логических сдвигов, за исключением сохранени€ знака байта при сдвиге вправо. Ћогический и арифметический сдвиги влево полностью идентичны.

ќбратите внимание, что при сдвиге вправо знаковый бит дублируетс€. Ёто позвол€ет сохран€ть знак байта.  ак в операци€х логических сдвигов флажек CF принимает значение последнего выдвинутого байта.

Ј ќперации ÷» Ћ»„≈— ќ√ќ —ƒ¬»√ј ¬ѕ–ј¬ќ (ROR), ÷» Ћ»„≈— ќ√ќ —ƒ¬»√ј ¬Ћ≈¬ќ (ROL), ÷» Ћ»„≈— ќ√ќ —ƒ¬»√ј ¬ѕ–ј¬ќ „≈–≈« ѕ≈–≈Ќќ— (RCR), ÷» Ћ»„≈— ќ√ќ —ƒ¬»√ј ¬Ћ≈¬ќ „≈–≈« ѕ≈–≈Ќќ— (RCL). »меют смысл дл€ беззнаковых байт.

ќсобенно коментировать эти операции не буду. ќбращаю ¬аше внимание только на использование флажка CF в операци€х циклических сдвигов через перенос.

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

¬от пожалуй и все, что можно сказать о байтах и операци€х на ними. Ёто был самый большой раздел. » самый трудный. Ќадеюсь, что ¬ы успешно преодолели все трудности. ƒальше будет легче.





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2015-05-08; ћы поможем в написании ваших работ!; просмотров: 1171 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

∆изнь - это то, что с тобой происходит, пока ты строишь планы. © ƒжон Ћеннон
==> читать все изречени€...

561 - | 450 -


© 2015-2023 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.036 с.