F * 256 = 15 * 256 = 3840
8 * 16 = 128
С * 1 = 12 * 1 = 12
3840 + 128 + 1 = 3980
Перевод числа FC в двоичное число лучше всего делать путем первоначального перевода в десятичное, а затем уже в двоичное:
F * 16 = 15 * 16 = 240
С * 1 = 12 * 1 = 12
240 + 12 = 252
Преобразование числа 252(10) в двоичное представление показано в следующей таблице:
Разряд 9 8 7 6 5 4 3 2 1
Степень 2^8 2^7 2^6 2^5 2^4 2 2 2 2
Значение 256 128 64 32 16 8 4 2 1
256 не укладывается ни разу.
1 раз 128 остаток 124
1 раз 64 остаток 60
1 раз 32 остаток 28
1 раз 16 остаток 12
1 раз 8 остаток 4
1 раз 4 остаток 0
0 раз 2
0 раз 1
1 1 1 1 1 1 0 0
Таким образом, мы получили двоичное число 1111 1100.
Теперь оказывается, что, представив это число как два набора, состоящих из четырех цифр, мы можем сделать одно магическое превращение.
Правый набор представляет собой число 1100. В десятичном выражении это число 12, а в шестнадцатеричном — число С.
Левый набор имеет вид 1111, который по основанию 10 представляется как число 15, а по основанию 16 — как число F. Итак, мы получили следующее:
1111 0000
F С
Расположив два шестнадцатеричных числа вместе, псшучаем число FC, которое равно настоящему значению 1111 1100. Этот быстрый метод преобразования работает всегда безотказно. Вы можете взять любое двоичное число любой длины, разбить его на группы по четыре разряда, перевести каждую группу в шестнадцатеричную цифру и расположить эти цифры вместе, чтобы получить шестнадцатеричное число. Вот другой пример:
1011 0001 1101 0111
Напомню, что в двоичной системе используются следующие граничные значения порядков: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384 и 32768.
1 X 1 = 1
1 x 2 = 2
1 X 4 = 4
0 x 8 = 0
1 x 16 = 16
1 x 32 = 0
1 x 64 = 64
1 x 128 = 128
1 x 256 = 256
1 x 512 = 0
1 Х 1024 = 0
1 x 2048 = 0
1 x 4096 = 4096
1 x 8192 = 8192
1 x 16384 = 0
1 x 32768 = 32768
Итого: 45527
Для преобразования этого числа в шестнадцатеричное вспомним граничные значения порядков в этой системе счислений:
65536 4096 256 16 1
Число 65 536 (значение пятого порядка) не укладывается в числе 45 527, в пятой позиции ставим 0. Число 4096 (значение четвертого порядка) укладывается в числе 45 527 одиннадцать раз с остатком 471. В остатке 471 число 256 (значение третьего порядка) укладывается один раз с остатком 215. В новом остатке 215 число 16 (значение второго порядка) укладывается 13 раз с остатком 7. Таким образом, получаем шестнадцатеричное число BlD7.
Проверим наши математические выкладки:
В (11) * 4096 = 45 056
1 * 256 = 256
D (13) * 16 = 208
7 * 1 = 7
Всего 45 527
Для проверки ускоренного метода перевода возьмем двоичное число 1011000111010111, разделим его на группы по четыре знака: 1011 0001 1101 0111. Каждая из четырех групп затем преобразуется в шестнадцатеричное число:
1011 =
1 x 1 = 1
1 x 2 = 2
0 x 4 = 0
1 x 8 = 8
Всего: 11
Шестнадцатеричное: В
0001 =
1 x 1 = 1
0 x 2 = 0
0 X 4 = 0
0 x 8 = 0
Всего: 1
Шестнадцатеричное: 1
1101 =
1 x 1 = 1
0 x 2 = 0
1 x 4 = 4
1 x 8 = 8
Всего: 13
Шестнадцатеричное: D
0111 =
1 X 1 = 1
1 X 2 = 2
1 x 4 = 4
0 x 8 = 0
Всего: 7
Шестнадцатеричное: 7
Итак, получаем шестнадцатеричное число B1D7
Приложение Г - Ответы
День 1
Контрольные вопросы
1. В чем разница между интерпретаторами и компиляторами?
Интерпретаторы считывают исходный код программы строка за строкой и преобразуют его непосредственно в машинные команды. Компиляторы преобразуют код источника в исполняемую программу, которая может быть выполнена в более позднее время.
2. Как происходит компиляция исходного кода программы?
Каждый компилятор имеет свои особенности. Обязательно ознакомьтесь с документацией, которая прилагается к вашему компилятору.
3. В чем состоит назначение компоновщика?
Задача компоновщика — связать скомпилированный код программы с элементами, взятыми из стандартных библиотек, предоставленных фирмой — изготовителем компилятора, и другими источниками. Компоновщик позволяет формировать отдельные модули программы, а затем соединять эти части в одну большую программу.
4. Какова обычная последовательность действий в цикле разработки?
Редактирование исходного кода, компиляция, компоновка, тестирование, повторение перечисленных выше действий.
Упражнения
1. Инициализирует две целочисленные переменные, а затем выводит их сумму и произведение.
2. Ознакомьтесь с документацией, которая прилагается к вашему компилятору.
3. В первой строке перед словом include нужно поместить символ #.
4. Эта программа выводит на экран слова Hello World, которые завершаются символом разрыва строки.
День 2
Контрольные вопросы
1. В чем разница между компилятором и препроцессором?
При каждом запуске компилятора первым запускается препроцессор. Он читает исходный код и включает указанные вами файлы, а также выполняет другие вспомогательные операции. Подробно функции препроцессора рассматриваются на занятии 18.
2. В чем состоит особенность функции main()?
Функция main() вызывается автоматически при каждом выполнении программы.
3. Какие два типа комментариев вы знаете и чем они отличаются друг от друга?
Строки комментариев в стиле C++ задаются двумя символами слеша (//), которые блокируют любой текст до конца текущей строки. Комментарии в стиле языка С заключаются в пары символов (/* */), и все, что находится между этими символами, блокируется от выполнения компилятором. Следует внимательно отнестись к использованию пар символов комментариев, чтобы не заблокировать целый блок программы.
4. Могут ли комментарии быть вложенными?
Да, комментарии в стиле C++ могут быть вложены внутрь комментариев в стиле С. Можно также комментарии в стиле С вкладывать внутрь комментариев в стиле C++, но при этом следует помнить, что комментарии в стиле C++ заканчиваются в конце текущей строки.
5. Могут ли комментарии занимать несколько строк?
Это позволено лишь комментариям в стиле С. Если же вы хотите продолжить на следующей строке комментарии в стиле C++, необходимо поставить в начале второй строки еще одну пару символов (//).
Упражнения
1. Напишите программу, которая выводит на экран сообщение I love C++.
1: #include <iostream.h>
2:
3: int main()
4: {
5: cout << "I love C++n";
6: return 0;
7: }
2. Напишите самую маленькую программу, которую можно скомпилировать, скомпоновать и выполнить.
int main() { returna 0; }
3. Жучки: введите эту программу и скомпилируйте ее. Почему она дает сбой? Как ее можно исправить?
1: #include <iostream.h>
2: int main()
3: {
4: cout << Is there a bug here?";
5: return 0;
6: }
В строке 4 пропущена открывающая кавычка для строкового выражения.
4. Исправьте ошибку в упражнении 3, после чего перекомпилируйте ее, скомпонуйте и запустите на выполнение.
1: #include <iostream.h>
2: int main()
3: {
4: cout << " Is there а bug fiere?";
5: return 0;
6: }
День 3
Контрольные вопросы
1. В чем разница между целочисленной и вещественной (с плавающей точкой) переменными?
Целочисленные переменные предназначены для работы с целыми числами, а вещественные — с вещественными числами, содержащими плавающую десятичную точку. Числа с плавающей точкой могут быть представлены с использованием мантиссы и экспоненты.
2. Каково различие между типами unsigned short int и long int?
Ключевое слово unsigned означает, что данная целочисленная переменная будет содержать только положительные числа. В большинстве компьютеров для коротких (short) целых чисел отводится 2 байта, а для длинных (long) — 4 байта.
3. Каковы преимущества использования символьной константы вместо литерала? Символьная константа "говорит сама за себя", т.е. само имя константы указывает на ее назначение. Кроме того, при внесении изменений символьную константу достаточно переопределить в одной строке исходного кода, в то время как при использовании литералов программисту придется редактировать код всюду, где встречается этот литерал.
4. Каковы преимущества использования ключевого слова const вместо директивы #define?
Константы, объявленные с помощью ключевого слова const, используются с контролем за соответствием типа, поэтому компилятор сможет заметить ошибку в случае неправильного определения или применения такой константы. Кроме того, поскольку эти константы остаются в программе после ее обработки препроцессором, они доступны отладчику.