Студопедия — ТЕОРЕТИЧЕСКАЯ ЧАСТЬ. 1.1. Базовые системы счисления
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

ТЕОРЕТИЧЕСКАЯ ЧАСТЬ. 1.1. Базовые системы счисления






 

1.1. Базовые системы счисления

 

В языке программирования С предусмотрено управление отдельными разрядами (битами) значения переменной. Эта возможность связывается с представлением числа в компьютере, а именно с различными системами счисления: двоичной, восьмеричной, шестнадцатеричной.

У бита возможны только два значения: 0 и 1. Техническую реализацию таких состояний легко представить, например включено – выключено, положительное значение напряжения – отрицательное значение напряжения (определенного уровня) и т. д.

В языке программирования С термин байт используется для обозначения размера (разрядности) хранения набора символов. Поэтому в языке С байт может содержать 8, 9, 16 и другое количество разрядов. Однако в характеристиках модулей памяти и систем передачи данных предполагается, что байт содержит восемь разрядов [1]. Разряды байта пронумерованы справа налево числами от 0 до 7. Седьмой разряд (крайний левый) называется старшим, а нулевой (крайний правый) – младшим.

Байт имеет наибольшее значение, когда все его разряды установлены, т. е. имеют значение 1. Например, для 8 разрядов с учетом двоичной системы счисления в случае возможного наибольшего значения получим:

                =  
27 26 25 24 23 22 21 20 =  

Наименьшему значению соответствует комбинация нулей 00000000, которая представляет собой просто нуль [9].

Байт может хранить числа от 0 до 255, что составляет 256 возможных значений. Программа может интерпретировать комбинацию разрядов иначе и применять байт для хранения чисел от –128 до 127, (также 256 значений). Например, тип unsigned char обычно характеризуется использованием байта для представления чисел в диапазоне от 0 до 255, тип signed char – до 127.

В основании восьмеричной системы счисления лежит число 8 (23). Каждое знакоместо восьмеричного числа соответствует определенной степени восьми. Для записи используются цифры от 0 до 7. Каждая цифра восьмеричного числа соответствует трем двоичным цифрам. Двоичные эквиваленты таких цифр представлены в табл. 16.1.

Таблица 16.1
Двоичные эквиваленты восьмеричных цифр
Восьмеричная цифра Двоичный эквивалент
   

В шестнадцатеричной системе счисления используются степени числа 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-значному двоичному числу [1], следовательно, две шестнадцатеричные цифры – одному восьмиразрядному байту. Первая цифра представляет 4 старших разряда, а вторая – 4 младших.

Соответствие между шестнадцатеричными цифрами, десятичными и двоичными числами показано в табл. 16.2.

Таблица 16.2
Эквиваленты шестнадцатеричных чисел
Десятичное число Шестнадцатеричная цифра Двоичный эквивалент
1 2 3
     
Окончание табл. 16.2
1 2 3
  A B C D E F  

В языке С существуют два средства управления разрядами [1]. Первое представляет собой набор поразрядных операций, а второе – форму полей данных, которая гарантирует доступ к разрядам значения типа int.

Далее будут использоваться 8-разрядные числа в двоичной системе счисления.

 

1.2. Логические поразрядные операции

 

В языке программирования С существуют два вида поразрядных операций: логические и операции сдвига [1]. Поразрядные операции выполняются над каждым разрядом независимо от того, находится он слева или справа, а также над целыми числами. Рассмотрим логические поразрядные операции.

Поразрядное отрицание обозначается символом тильда (~). Унарная операция ~ преобразовывает все единицы в нули и все нули в единицы (предполагается, что операции производятся над двоичными числами). Ее называют также операцией «дополнение», т. е. все биты, равные 0, переводятся в 1, а когда все биты, равные 1, – в 0.

Поразрядная операция И обозначается символом &;. Двоичная операция &; создает новое значение за счет выполнения поразрядного сравнения двух операндов. Для каждой позиции результирующий разряд будет иметь значение 1 только в случае, когда соответствующие разряды обоих операндов имеют значение 1. Можно сказать, что когда над двумя значениями производится операция поразрядного умножения &;, то двоичные представления чисел сравниваются бит за битом [2]. Например, пусть одна переменная w 1 есть число 25, а другая w 2 – число 77. Соответственно в двоичном представлении 25 = 0000000000011001, 77 = 0000000001001101. Тогда в результате поразрядной операции &;получим число w 3 = w 1 & w 2. Результат действия оператора &;можно представить следующим образом:

Поразрядная операцияИ (&)
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, а остальные сохраняют свое значение [2]. Маска представляет собой некоторую комбинацию разрядов [1]. Разряды маски с нулевыми значениями можно считать аналогом непрозрачных ячеек реальной маски, а разряды со значениями 1 – прозрачными ячейками.

Поразрядная операция &;называется также конъюнкцией, или логическим умножением, часто обозначается словом AND.

Поразрядная операция ИЛИ обозначается символом |. Когда над двумя значениями производится операция, то последовательно сравниваются значения всех битов при их двоичном представлении [5]. Если соответствующий бит имеет значение 1 в первом или втором операнде, то результирующее значение будет равно 1. Рассмотрим предыдущий пример с поразрядной операцией ИЛИ:

Поразрядная операцияИЛИ (|)
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 1 0 1 1 1 0 1 (93)

Данную операцию обычно используют для установки заданных битов слова в 1. Ее называют также включающей дизъюнкцией, или логическим сложением. Часто применяется обозначение OR.

Поразрядная операция исключающего ИЛИ (^) работает следующим образом [5]. Сравниваются соответствующие биты двух операндов, и если только один из битов равен 1, будет получен результат 1, а при равенстве обоих соответствующих битов или 0, или 1 результат будет равен 0. Для двух операндов b1, b2 при использовании исключающего ИЛИ справедлива таблица истинности (табл. 16.3).

Таблица 16.3
Таблица истинности операции исключающего ИЛИ
b1 b2 b1 ^ b2
     
     
     
     

Если операцию исключающего ИЛИ использовать для одного и того же значения, то в результате получится нуль. Этот прием часто использовался программистами в языке ассемблера как наиболее быстрый путь установить значение в нуль или сравнить два значения на их равенство. Данный способ не рекомендуется использовать в языке программирования С, так как скорость работы не повышается, а программа становится менее понятной [2]. Операция исключающего ИЛИ может применяться для перестановки значений двух переменных без выделения дополнительной памяти (и соответственно без использования дополнительной переменной).

Поразрядная операция исключающего ИЛИ называется также исключающей дизъюнкцией, применяется обозначение XOR.

 

1.3. Поразрядные операции сдвига

Оператор сдвига влево <<;

Когда оператор сдвига влево <<; выполняется над некоторым значением, все биты, составляющие это значение, сдвигаются влево [2]. Связанное с данным оператором число показывает количество бит, на которое значение должно переместиться. Биты, сдвигающие со старшего разряда, считаются потерянными, а на место младших битов всегда помещаются нули.

Оператор сдвига вправо >>;

Операция сдвига вправо >>; сдвигает разряды левого операнда вправо на количество позиций, указываемое правым операндом. Выходящие за правую границу разряды теряются. Для типов данных без знака (unsigned) освобождаемые слева позиции заполняются нулями. Для знаковых типов результат зависит от используемой системы. Освобождаемые позиции могут заполняться нулями либо копиями знакового (первого слева) разряда [1].

Поразрядные операции сдвига могут служить удобным и эффективным средством выполнения операций умножения и деления на числа, представляющие собой степени двойки [1]. Они аналогичны смещению десятичной точки при умножении или делении на 10.

 

1.4. Битовые поля

 

Второй метод управления разрядами состоит в использовании битового (разрядного) поля [1], которое представляет собой последовательную цепочку разрядов в рамках значения типа signed int или unsigned int. Оно может быть только элементом структуры или объединения [3]. Создается путем объявления структуры (объединения), которая помечает каждое поле и определяет его разряд.

Приведем пример с использованием битовых полей в структуре [2]:

struct packed_struct {

unsigned int: 3;

unsigned int f1: 1;

unsigned int f2: 1;

unsigned int f3: 1;

unsigned int type: 8;

unsigned int index: 18; };


В созданном шаблоне-структуре с дескриптором packed_struct первый член не имеет имени. Символ :3 задает три безымянных бита. Второй, третий и четвертый члены структуры – f1, f2, f3 также имеют тип unsigned int. Символ :1 говорит о том, что в данном члене структуры будет храниться 1 бит. Член структуры с именем type в памяти занимает 8 бит, член структуры index рассчитан на хранение 18 бит.

Для заданного шаблона структуры можно определить структурную переменную, например

struct packed_struct packed_data;

После этого можно присваивать значения полям структуры:

packed_data.type = 7;

Если ранее была объявлена какая-то переменная, например n, то присвоение может быть таким:

packed_data.type = n;

При этом нет необходимости беспокоиться о том, что значение переменной n будет слишком большим. Только младшие 8 бит будут учитываться при присваивании значения для поля packed_data.type. Для извлечения битовых полей структуры можно использовать обычное утверждение:

n = packed_data.type;

После извлечения значения поля type будет произведен сдвиг в сторону младших бит.

Битовые поля могут быть объявлены только как тип int (в стандарте С99 также _Bool), от реализации которого зависит, будет он знаковым (signed) или беззнаковым (unsigned). Для исключения неоднозначности следует использовать явные объявления: signed int или unsigned int. Битовые поля нельзя объединять в массивы, нельзя использовать адрес битового поля, поэтому не может быть такого типа, как «указатель на битовое поле» [2]. Компилятор языка программирования С не переупорядочивает битовые поля для получения оптимального распределения памяти. Но в некоторых случаях может производиться выравнивание за счет безымянного поля. Это может использоваться для выравнивания следующего поля структуры по границе блока [2].

С помощью битовых полей можно формировать объекты с длиной внутреннего представления, не кратной байту.

 

 







Дата добавления: 2015-09-06; просмотров: 418. Нарушение авторских прав; Мы поможем в написании вашей работы!



Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

Схема рефлекторной дуги условного слюноотделительного рефлекса При неоднократном сочетании действия предупреждающего сигнала и безусловного пищевого раздражителя формируются...

Уравнение волны. Уравнение плоской гармонической волны. Волновое уравнение. Уравнение сферической волны Уравнением упругой волны называют функцию , которая определяет смещение любой частицы среды с координатами относительно своего положения равновесия в произвольный момент времени t...

Медицинская документация родильного дома Учетные формы родильного дома № 111/у Индивидуальная карта беременной и родильницы № 113/у Обменная карта родильного дома...

Примеры решения типовых задач. Пример 1.Степень диссоциации уксусной кислоты в 0,1 М растворе равна 1,32∙10-2   Пример 1.Степень диссоциации уксусной кислоты в 0,1 М растворе равна 1,32∙10-2. Найдите константу диссоциации кислоты и значение рК. Решение. Подставим данные задачи в уравнение закона разбавления К = a2См/(1 –a) =...

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

В теории государства и права выделяют два пути возникновения государства: восточный и западный Восточный путь возникновения государства представляет собой плавный переход, перерастание первобытного общества в государство...

Studopedia.info - Студопедия - 2014-2024 год . (0.008 сек.) русская версия | украинская версия