Программный код решения примера:
#include <stdio. h> #include <conio. h> #define MAX 20 // Шаблон структуры struct test { char A[MAX+1]; double ax; char B[MAX+1]; double by; }; //Прототип вспомогательной функции double sum(double, double); // Главная функция int main (void) { struct test AB; // создание новой структурной переменной //Заполнение полей структуры printf("\n\t Type 1 st name: "); gets_s(AB. A, MAX); printf("\t Enter the first real number: "); scanf_s("%lf", &AB. ax); _flushall(); printf("\n\t Enter 2 nd name: "); gets_s(AB. B, MAX); printf("\t Enter the second real number: "); scanf_s("%lf", &); printf("\n\t The sum of two numbers \ %1.2f and %1.2f, %s and %s: %1.2f\n", AB. ax, , AB. A, AB. B, sum(AB. ax, )); printf("\n Press any key: "); _getch(); return 0; } // Функция суммирования двух чисел double sum(double x, double y) { return (x + y); } |
Возможный результат выполнения программы показан на рис. 12.1.

Рис. 12.1. Сумма двух чисел, переданных в качестве аргументов функции
13. Операции с разрядами (битами) в языке С
13.1. Базовые системы счисления
В языке программирования С предусмотрено управление отдельными разрядами (битами) значения переменной. Эта возможность связывается с представлением числа в компьютере, а именно с различными системами счисления: двоичной, восьмеричной, шестнадцатеричной.
У бита возможны только два значения: 0 и 1. Техническую реализацию таких состояний легко представить, например включено – выключено, положительное значение напряжения – отрицательное значение напряжения (определенного уровня) и т. д.
В языке программирования С термин байт используется для обозначения размера (разрядности) хранения набора символов. Поэтому в языке С байт может содержать 8, 9, 16 и другое количество разрядов. Однако в характеристиках модулей памяти и систем передачи данных предполагается, что байт содержит восемь разрядов. Разряды байта пронумерованы справа налево числами от 0 до 7. Седьмой разряд (крайний левый) называется старшим, а нулевой (крайний правый) – младшим.
Байт имеет наибольшее значение, когда все его разряды установлены, т. е. имеют значение 1. Например, для 8 разрядов с учетом двоичной системы счисления в случае возможного наибольшего значения получим:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | = | 255 |
27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
Наименьшему значению соответствует комбинация нулей 00000000, которая представляет собой просто нуль.
Байт может хранить числа от 0 до 255, что составляет 256 возможных значений. Программа может интерпретировать комбинацию разрядов иначе и применять байт для хранения чисел от –128 до 127, (также 256 значений). Например, тип unsigned char обычно характеризуется использованием байта для представления чисел в диапазоне от 0 до 255, тип signed char – до 127.
В основании восьмеричной системы счисления лежит число 8 (23). Каждое знакоместо восьмеричного числа соответствует определенной степени восьми. Для записи используются цифры от 0 до 7. Каждая цифра восьмеричного числа соответствует трем двоичным цифрам. Двоичные эквиваленты таких цифр представлены в табл. 13.1.
Таблица 13.1 | |
Двоичные эквиваленты восьмеричных цифр | |
Восьмеричная цифра | Двоичный эквивалент |
0 1 2 3 4 5 6 7 | 000 001 010 011 100 101 110 111 |
В шестнадцатеричной системе счисления используются степени числа 16 и цифры от 0 до 15. Для представления цифр, соответствующих десятичным значениям от 10 до 15, применяются буквы от A до F [1]. Например, в шестнадцатеричном числе A3F (в языке С записывается как 0xA3F) заложено следующее значение:
10 × 162 + 3 × 161 + 15 × 160 = 2 623 (по основанию 10).
В приведенной записи числу 10 соответствует А, а числу 15 – F.
Язык С допускает использование букв нижнего и верхнего регистра (строчных и прописных) для обозначения шестнадцатеричных цифр. Таким образом, число 2 623 в указанной системе счисления можно записать как 0xA3F, так и 0xa3f. Каждая цифра шестнадцатеричного числа соответствует 4-значному двоичному числу, следовательно, две шестнадцатеричные цифры – одному восьмиразрядному байту. Первая цифра представляет 4 старших разряда, а вторая – 4 младших.
Соответствие между шестнадцатеричными цифрами, десятичными и двоичными числами показано в табл. 13.2.
Таблица 13.2 Эквиваленты шестнадцатеричных чисел | ||
Десятичное число | Шестнадцатеричная цифра | Двоичный эквивалент |
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 0 1 2 3 4 5 6 7 7 9 A B C D E F | 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 |
В языке С существуют два средства управления разрядами. Первое представляет собой набор поразрядных операций, а второе – форму полей данных, которая гарантирует доступ к разрядам значения типа int.
Далее будут использоваться 8-разрядные числа в двоичной системе счисления.
13.2. Логические поразрядные операции
В языке программирования С существуют два вида поразрядных операций: логические и операции сдвига. Поразрядные операции выполняются над каждым разрядом независимо от того, находится он слева или справа, а также над целыми числами. Рассмотрим логические поразрядные операции.
Поразрядное отрицание обозначается символом тильда (~). Унарная операция ~ преобразовывает все единицы в нули и все нули в единицы (предполагается, что операции производятся над двоичными числами). Ее называют также операцией «дополнение», т. е. все биты, равные 0, переводятся в 1, а равные 1 – в 0.
Поразрядная операция И обозначается символом &. Двоичная операция & создает новое значение за счет выполнения поразрядного сравнения двух операндов. Для каждой позиции результирующий разряд будет иметь значение 1 только в случае, когда соответствующие разряды обоих операндов имеют значение 1. Можно сказать, что когда над двумя значениями производится операция поразрядного умножения &, то двоичные представления чисел сравниваются бит за битом. Например, пусть одна переменная w1 есть число 25, а другая w2 – число 77. Соответственно в двоичном представлении 25 = = 0000000000011001, 77 = 0000000001001101. Тогда в результате поразрядной операции & получим число w3 = w1 & w2. Результат действия оператора & можно представить следующим образом:
Поразрядная операция И (&) |
w1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 (25) |
w2 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 (77) |
w3 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 (9) |
В результате поразрядной операции & над двумя числами (25 и 77 в двоичном представлении), которые имеют, например, 16 бит, получили новое число 9.
Поразрядный оператор & часто используется для операций маскирования. С его помощью принудительно можно установить определенный бит данных в значение 0. Например, в утверждении
w3 = w1 & 3;
переменной w3 присваивается значение переменной w1, для которой выполнена поразрядная операция & со значением 3. При этом все биты левее двух младших битов устанавливаются в 0, а остальные сохраняют свое значение. Маска представляет собой некоторую комбинацию разрядов. Разряды маски с нулевыми значениями можно считать аналогом непрозрачных ячеек реальной маски, а разряды со значениями 1 – прозрачными ячейками.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Основные порталы (построено редакторами)
