ОСНОВЫ ПРОГРАММНОГО  КОНСТРУИРОВАНИЯ                 Лекция № 3              5 марта 2013 г.
ЧИСЛА В МАШИНЕ• Нетединственного представления.• Каждоепредставление имеет свои достоинства и недостатки.• "123.45"   (стр...
ДВОИЧНАЯ СИСТЕМА• Быстрее   всех.• Память   можно представить как: • набор    байтов, или 8-битных чисел (char). • набор  ...
ПЕРЕВОД 2                 10• Делим   пополам, сохраняя остатки.• 337=168*2+1; 168=84*2+0; 84=42*2+0; 42=21*2+0; 21=10*2+1...
В ПАМЯТИ0 0 0 0 0 0 0 1                           0 1 0 1 0 0 0 115       14   13   12   11   10   9   8   7   6   5   4  ...
16-РИЧНАЯ СИСТЕМА• Число   в двоичной записи делится на тетрады (по 4 бита): • 1010100012={0001}{0101}{0001}=15116.• «Поня...
КАК ХРАНИТЬ ЗНАК• Отдельной  памяти под знак нет, нужно втискивать его в те же 16 (8, 32, 64, …) бит.• Кодируем   знак: «п...
ПРОБЛЕМЫ СО ЗНАКОМ В      СТАРШЕМ БИТЕ• Простейшая арифметика (сложение, вычитание) отличается от беззнакового случая.• По...
ДРУГОЙ ПОДХОД КОТРИЦАТЕЛЬНЫМ ЧИСЛАМ• Процессор выполняет операции сложения и вычитания по модулю, соответствующему размеру...
ДВОИЧНЫЙ  ДОПОЛНИТЕЛЬНЫЙ КОД• −X➯ 2N−X, где N – размер слова. (X+(−X)) mod 2N = 2N mod 2N = 0. (X−(−X)) mod 2N = (X+X+2N) ...
УМНОЖЕНИЕ И ДЕЛЕНИЕ• Приходится   учитывать знак. А вы как думали?• Знаковоеумножение и деление отличается от беззнакового.
ПЕРЕПОЛНЕНИЕ• (−128)−1   = 1000 00002−1 = 0111 11112 = 127. Ого!• 127+1   = 0111 11112+1 = 1000 00002 = −128. Ой!
НЕДОСТАТКИ ДВОИЧНОЙ        СИСТЕМЫ• Нормальные  люди (не программисты) хотят видеть числа в 10-тичной системе (а не 2, 8, ...
ВАРИАНТЫ?• Хранитьчисло прямо в строке (123456 ➯ "123456") слишком накладно по памяти.• Промежуточный вариант: двоично-дес...
PACKED BCD•   33710 ➯ {3}{3}{7} ➯ {0011}2{0011}2{0111}2=11001101112.•   BCD-представление числа 33710 аналогично двоичному...
ОПЕРАЦИИ С PACKED BCD•   Можно складывать и вычитать битовые представления    напрямую, если после этого выполнять коррекц...
СИМВОЛЫ• Кодировка: соответствие символа коду (и наоборот).     !"#$%&()*+,—./                               0123456789:;<...
УПРАВЛЯЮЩИЕ СИМВОЛЫ            ASCII•   Null, 0x00, 0 – пустой          •   Line Feed, 0x0A, n – перевод    символ.       ...
UNICODE• Решение   проблем с 8-битными кодировками.• Композитные   символы.• Много   кодов: 1 112 064.• Требует        либ...
СТРОКИ• Строка   – массив символов, но может иметь переменную длину!• Нужно    как-то хранить длину, как?
ДЛИНА СТРОКИ• Два   стандартных приема: • Хранение    длины в начале строки (первые 1/2/4 байта).               6    s    ...
«ВЕРЕВКИ»             +Основы                        +         + прог        раммного       конструирования
ОПЕРАЦИИ СО СТРОКАМИ•   Конкатенация                   •   Поиск подстроки.    ("abc" + "def" ➯ "abcdef").    •   Сравнени...
СЕРИАЛИЗАЦИЯ• Строкав широком смысле – последовательность байт известного размера.• Сериализация: превращение любой структ...
СЕРИАЛИЗАЦИЯ МАССИВА•   N+1 целых чисел: длина + значения самого массива.•   Big-endian и little-endian:    •   1234567816...
КОНЕЦ ТРЕТЬЕЙ ЛЕКЦИИ
Upcoming SlideShare
Loading in …5
×

ОПК № 3 – Машинное представление целых чисел, символов, строк

1,836 views
1,697 views

Published on

1. Двоичная система счисления, перевод чисел, битовое представление.
2. Шестнадцатеричная система счисления.
3. Хранение знака: знак в старшем бите (наивный способ).
4. Арифметика по модулю и двоичный дополнительный код.
5. Переполнение.
6. Двоично-десятичный код, Packed BCD.
7. Символы и кодировки: от ASCII к Unicode.
8. Строки, базовые способы их представления.
9. Операции со строками.
10. «Веревки» — альтернативный способ представления строк.
11. Сериализация и десериализация. Пример: сериализация массива чисел переменной длины.
12. Двойственность порядка байт: little-endian и big-endian.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,836
On SlideShare
0
From Embeds
0
Number of Embeds
295
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

ОПК № 3 – Машинное представление целых чисел, символов, строк

  1. 1. ОСНОВЫ ПРОГРАММНОГО КОНСТРУИРОВАНИЯ Лекция № 3 5 марта 2013 г.
  2. 2. ЧИСЛА В МАШИНЕ• Нетединственного представления.• Каждоепредставление имеет свои достоинства и недостатки.• "123.45" (строка) – тоже вариант.
  3. 3. ДВОИЧНАЯ СИСТЕМА• Быстрее всех.• Память можно представить как: • набор байтов, или 8-битных чисел (char). • набор коротких слов, или16-битных чисел (short int). • набор слов, или 32-битных чисел (int). • набор длинных слов, или 64-битных чисел (long int).
  4. 4. ПЕРЕВОД 2 10• Делим пополам, сохраняя остатки.• 337=168*2+1; 168=84*2+0; 84=42*2+0; 42=21*2+0; 21=10*2+1; 10=5*2+0; 5=2*2+1; 2=1*2+0; 1=0*2+1.• Записываем в обратном порядке: 1010100012=33710.• Обратно: 1010100012=20+24+26+28=1+16+64+256=337.
  5. 5. В ПАМЯТИ0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 115 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0• Для представления числа 337 нужно как минимум 2 байта. • 8 бит: 0..255 • 16 бит: 0..65535. • 32 бита: 0..4294967295 (4,2 млрд.) • 64 бита: 0..18446744073709551615 (≃1,8*1019).
  6. 6. 16-РИЧНАЯ СИСТЕМА• Число в двоичной записи делится на тетрады (по 4 бита): • 1010100012={0001}{0101}{0001}=15116.• «Понятная» запись констант: • 32 бита: диапазон чисел 0..FFFFFFFF16. • 0xDEADBEEF, 0xCAFEBABE, …
  7. 7. КАК ХРАНИТЬ ЗНАК• Отдельной памяти под знак нет, нужно втискивать его в те же 16 (8, 32, 64, …) бит.• Кодируем знак: «плюс» ➯ 0, «минус» ➯ 1.• Попробуем поместить знак в старший бит: • +337 ➯ 0000 0001 0101 00012 • −337 ➯ 1000 0001 0101 00012
  8. 8. ПРОБЛЕМЫ СО ЗНАКОМ В СТАРШЕМ БИТЕ• Простейшая арифметика (сложение, вычитание) отличается от беззнакового случая.• Появляются случаи +0 и −0.
  9. 9. ДРУГОЙ ПОДХОД КОТРИЦАТЕЛЬНЫМ ЧИСЛАМ• Процессор выполняет операции сложения и вычитания по модулю, соответствующему размеру слова.•В коротком слове: (FFFF16+1) mod 216=0.• Забудем на секунду о модуле: X+1=0. Чему равно X?
  10. 10. ДВОИЧНЫЙ ДОПОЛНИТЕЛЬНЫЙ КОД• −X➯ 2N−X, где N – размер слова. (X+(−X)) mod 2N = 2N mod 2N = 0. (X−(−X)) mod 2N = (X+X+2N) mod 2N = 2X.• Единица в старшем бите все-таки служит индикатором знака. Для N=8: • 0000 00002 ➯ 0 (мин. положительное число). 0111 11112 ➯ 127 (2N-1-1, макс. положительное число). 1000 00002 ➯ −128 (−2N-1, мин. отрицательное число). 1111 11112 ➯ −1 (макс. отрицательное число).
  11. 11. УМНОЖЕНИЕ И ДЕЛЕНИЕ• Приходится учитывать знак. А вы как думали?• Знаковоеумножение и деление отличается от беззнакового.
  12. 12. ПЕРЕПОЛНЕНИЕ• (−128)−1 = 1000 00002−1 = 0111 11112 = 127. Ого!• 127+1 = 0111 11112+1 = 1000 00002 = −128. Ой!
  13. 13. НЕДОСТАТКИ ДВОИЧНОЙ СИСТЕМЫ• Нормальные люди (не программисты) хотят видеть числа в 10-тичной системе (а не 2, 8, 16, …)• Преобразование в 10-тичную систему требует памяти и вычислений (последовательное деление на 10 с остатком).• Для встроенных систем (калькуляторы, холодильники) это может быть критично.
  14. 14. ВАРИАНТЫ?• Хранитьчисло прямо в строке (123456 ➯ "123456") слишком накладно по памяти.• Промежуточный вариант: двоично-десятичное кодирование (BCD), т.е. битовое кодирование каждой десятичной цифры.• Packed BCD: на каждую цифру тратится 4 бита (полубайт).
  15. 15. PACKED BCD• 33710 ➯ {3}{3}{7} ➯ {0011}2{0011}2{0111}2=11001101112.• BCD-представление числа 33710 аналогично двоичному представлению 33716! Для знака обычно выделяется младший полубайт: • «+» ➯ C16=11002 «−» ➯ D16=11012.• Со знаком: 33710 ➯ 337С16= 0011 0011 0111 11002.• В 32 битах можно представить числа ±9 999 999 (7 цифр+знак).
  16. 16. ОПЕРАЦИИ С PACKED BCD• Можно складывать и вычитать битовые представления напрямую, если после этого выполнять коррекцию! • 1116+1516=2616. Коррекция не требуется. • 1116+1916=2A16. Поскольку был выход за границы 0..9, добавляем еще 6 к переполнившемуся разряду: 2A16+6=3016. • Вычитание: A−B=A+(99....9)–B+1.• Умножение – столбиком, деление – уголком.
  17. 17. СИМВОЛЫ• Кодировка: соответствие символа коду (и наоборот). !"#$%&()*+,—./ 0123456789:;<=>?• ASCII: основа всего. @ABCDEFGHIJKLMNO • 32 управляющих символа. PQRSTUVWXYZ[]^_ `abcdefghijklmno • 96 информационных pqrstuvwxyz{|}~_ символов.
  18. 18. УПРАВЛЯЮЩИЕ СИМВОЛЫ ASCII• Null, 0x00, 0 – пустой • Line Feed, 0x0A, n – перевод символ. строки.• Bell, 0x07, a – звуковой • Line Tabulation, 0x0B, v – сигнал. вертикальная табуляция.• Backspace, 0x08, b – возврат • Form Feed, 0x0C, f – смена на шаг. страницы.• Character Tabulation, 0x09, t • Carriage Return, 0x0D, r – – горизонтальная табуляция. возврат каретки.
  19. 19. UNICODE• Решение проблем с 8-битными кодировками.• Композитные символы.• Много кодов: 1 112 064.• Требует либо много памяти (UTF-32), либо символы имеют переменную длину (UTF-8).
  20. 20. СТРОКИ• Строка – массив символов, но может иметь переменную длину!• Нужно как-то хранить длину, как?
  21. 21. ДЛИНА СТРОКИ• Два стандартных приема: • Хранение длины в начале строки (первые 1/2/4 байта). 6 s t r i n g • Специальный символ. В языке C этим символом является символ с кодом 0. s t r i n g 0
  22. 22. «ВЕРЕВКИ» +Основы + + прог раммного конструирования
  23. 23. ОПЕРАЦИИ СО СТРОКАМИ• Конкатенация • Поиск подстроки. ("abc" + "def" ➯ "abcdef"). • Сравнение двух строк.• Вычисление длины. • Копирование.• Выделение подстроки. • Разбиение на подстроки (например, на слова).• Взятие символа по индексу i. • Преобразование в число и• Удаление/замена подстроки. наоборот.• Поиск символов.
  24. 24. СЕРИАЛИЗАЦИЯ• Строкав широком смысле – последовательность байт известного размера.• Сериализация: превращение любой структуры данных в строку (десериализация – восстановление структуры данных).• Пример сериализации: массив целых чисел (int) переменной длины (N).
  25. 25. СЕРИАЛИЗАЦИЯ МАССИВА• N+1 целых чисел: длина + значения самого массива.• Big-endian и little-endian: • 1234567816 ➯ 12 34 56 78 (big-endian, «от старшего к младшему»). • 1234567816 ➯ 78 56 34 12 (little-endian, «от младшего к старшему»).• Сериализация матрицы? Произвольного множества векторов?
  26. 26. КОНЕЦ ТРЕТЬЕЙ ЛЕКЦИИ

×