Версия:
Аннотация
Целые числа имеют свою специфику. Используются в целочисленной арифметике, а также для вычисления битовых операций.
Цель. Изучить представление целых чисел. В частности, битовые операции над ними.
Предварительный вариант!
Как отмечалось уже в самой первой заметке целые числа имеют свою специфику, в частности, специальные вычислительные операции над ними.
Что есть целое число рассматривается в курсе алгебры. Оно в частности не имеет дробной части.
Десятичное представление. Неотрицательные целые числа можно записать в десятичной системе записи. Необходимо четко понимать, что фактически это означает следующее:
Таким образом число представляется в виде суммы степеней числа десять () умноженных на некий неотрицательный коэффициент () меньшей 10: где . Коэффициент является старшим, точнее говоря, можно сказать, что для представления числа потребовалось разрядов. Само число можно писать в виде , где цифра указывается для того, чтобы подчеркнуть десятичную систему исчисления.
Такое разложение можно выполнить не только для числа , но и для других положительных целых чисел, т.е. по других основаниям. В других системах исчислениях дабы это подчеркнуть в качестве правого нижнего индекса указывается соответствующее число.
С вычислительными системами тесно связаны двоичная и шестнадцатеричная система исчисления.
Двоичное представление Можно представить число и в родной компьютеру системе исчисления, а именно – в двоичной системе (иначе, бинарное представление). В данной системе число записывается не по базе , а по базе , т.е. разряд соответствует числу . Соответственно будут просто равны либо либо . Для рассмотренного ранее числа:
По аналогии с десятичной системой это число можно записать компактно как:
Упражнение. Напишите программу, которая печатает двоичное представление введенного числа.
В программах на Си числа в бинарном представлении можно использовать только в последних редакциях (C++14):
Шестнадцатеричные числа Одна из причин того, что бинарное представление в языке Си отсутствовало так долго, заключается в том, что оно крайне длинное. Более профессионально использовать шестнадцатеричное представление чисел. Продолжая представления того же числа по аналогии для основания :
Для удобства в шестнадцатеричной системе разряды имеющие значение больше равное чем заменяются на буквенное представление:
значение | обозначение | значение | обозначение |
10 | A | 13 | D |
11 | B | 14 | E |
12 | C | 15 | F |
В согласие с отмеченными обозначениями:
В программах на Си числа в шестнадцатеричном представлении можно записать следующим образом:
Более того, в отличии от двоичного представления числа можно напечатать в шестнадцатеричном представлении используя нужный формат в printf
По аналогии с печатью числа могут быть считаны в шестнадцатеричной системе исчисления:
При записи чисел альтернативой к является , т.е. в конце числа добавляется символ . Это связано с тем, что не всегда есть возможность напечатать нижний индекс, в особенности это касается число текстовых файлов, например, исходных файлов с программой.
Упражнение. Доделайте прошлый фрагмент кода так, чтобы он вывел число как 7bh.
Упражнение. Напишите программу которая выводит число в произвольной системе исчисления.
Восьмеричные числа Для восьмеричной системы справедливо:
В программах на Си числа в восьмеричном представлении можно записать следующим образом:
Печать и считывание в восьмеричной системе полностью аналогична шестнадцатеричной системе. В формате вместо x нужно использовать o:
Как было показано в предыдущем подразделе число можно представить в двоичной системе исчисления. Каждый разряд может быть либо либо , минимальный элемент памяти – бит, который фактически соответствует неким физическим процессам. В памяти компьютера можно хранить только ограниченное количество битов. С числами рациональное оперировать когда они имеют одинаковое количество битов, т.е. представлены фиксированным заранее определенным количеством битов.
В следствии чего в компьютере целые числа имеют несколько подтипов, характеризующиеся количеством разрядов в представлении числа. С точки зрения удобства количества битов в представление числа увеличивается в два раза с каждым увеличением разрядности числа. Стандартно: , , , и так далее.
Знаковый тип Данный тип данных уже не раз ранее встречался в заметках:
Есть типы встроенные в сам язык: char, short, int, long int, long long int. Об их размере известно только то, что он не убывает.
Такое представление Кольцо вычетов.
Без знаковый Добавляется слово unsigned:
Такую модификацию можно сделать с любым из целым типом ранее перечисленных: unsigned char, unsigned short, unsigned int, unsigned long int, unsigned long long int.
Рассмотренные выше типы языка Си (char, short, int, ... ) лучше всего использовать в обычных вычислениях, где не важен точный битовый размер каждого из типов данных. В задачах, где как раз битовый размер важен, предпочтительно использовать предопределенные специальные типы. Отмечу, что рассматриваемые вспомогательные типы данных не задаются языком Си, а являются частью часто идущим с ним стандартной библиотеки (они определяются в заголовочном файле stdint.h).
Объявление переменных Для создания типа нужного размера лучше воспользоваться вспомогательными знаковыми типами: int8_t, int16_t, int32_t и тому подобные. Они гарантируют нужный размер в битах. Соответственно вспомогательные беззнаковые типы обозначаются как: uint8_t, uint16_t, uint32_t и тому подобные.
Ввод и вывод Для выполнения операций ввода/вывода лучше всего использовать опять же корректный способ. Для это придется добавить ещё один заголовочный файл inttypes.h. Тогда
Этих вариантов много. В большинстве случаев можно догадаться, иначе можно просто открыть отмеченный заголовочный файл и проверить.
Считается что число имеет фиксированное количество битов в его представлении. Битовые операции выполняются по-битово, т.е. для каждого из разрядов по-отдельности. Последнее фактически означает, что результат операции для какого либо разряда не влияет на результат действия двоичной операции на другие разряды. Можно считать, что операции выполняются в неком смысле в параллель.
Унитарная операция Выполняется с одним битом одного операнда (числа). Инвертирование каждого из битов, в языке Си обозначается операцией :
бит | |
0 | 1 |
1 | 0 |
Так,
В последнем выражении просьба не путать унитарную операцию и операцию сведения к числу.
Бинарные операции Действуют между двумя числами. В Си заданы следующие бинарные битовые операции: и (см. а), или (см. б.) и либо (см. в.).
а)
& | ||
| | ||
Не путать с логическими операциями И и ИЛИ в которых используется двойной символ (соответственно, и ).
Битовый сдвиг С точки зрения битового представления в процессорах есть и в языке Си реализована операция побитового сдвига, а именно – число можно по-битово сдвинуть как влево(), так и право (). По сути этим операциям соответствует умножение и деление на . Но есть тонкости.