В математике и вычислительной технике шестнадцатеричная система счисления (также с основанием 16 или просто шестнадцатеричная ) представляет собой позиционную систему счисления , которая представляет числа с использованием системы счисления (основания) шестнадцати. В отличие от десятичной системы, представляющей числа с помощью десяти символов, шестнадцатеричная использует шестнадцать различных символов, чаще всего символы «0» – «9» для обозначения значений от 0 до 9 и «A» – «F» (или, альтернативно, «a» – «). f") для обозначения значений от десяти до пятнадцати.
Разработчики программного обеспечения и проектировщики систем широко используют шестнадцатеричные числа, поскольку они обеспечивают удобное для человека представление двоичных значений. Каждая шестнадцатеричная цифра представляет четыре бита (двоичные цифры), также известные как полубайт (или полубайт). [1] Например, 8-битный байт может иметь значения в диапазоне от 00000000 до 11111111 (от 0 до 255 десятичных чисел) в двоичной форме, которую удобно представить как от 00 до FF в шестнадцатеричном формате.
В математике для обозначения основания обычно используется нижний индекс. Например, десятичное значение23 973 будет выражаться в шестнадцатеричном виде как 5DA5 16 . В программировании шестнадцатеричные числа обозначаются несколькими обозначениями, обычно с префиксом. Префикс 0x
используется в C , который обозначает это значение как 0x5DA5
.
Шестнадцатеричное число используется в кодировке передачи Base16 , в которой каждый байт открытого текста разбивается на два 4-битных значения и представлен двумя шестнадцатеричными цифрами.
В большинстве текущих случаев использования буквы A–F или a–f обозначают значения 10–15, а цифры 0–9 используются для обозначения их десятичных значений.
Не существует универсального соглашения об использовании нижнего или верхнего регистра, поэтому каждый из них преобладает или предпочтителен в определенных средах по стандартам или соглашениям сообщества; используется даже смешанный случай. Семисегментные дисплеи используют AbCdEF в смешанном регистре для создания цифр, которые можно отличить друг от друга.
Существует некоторая стандартизация использования пробелов (а не запятых или других знаков препинания) для разделения шестнадцатеричных значений в длинном списке. Например, в следующем шестнадцатеричном дампе каждый 8-битный байт представляет собой 2-значное шестнадцатеричное число с пробелами между ними, а 32-битное смещение в начале представляет собой 8-значное шестнадцатеричное число.
00000000 57 69 6b 69 70 65 64 69 61 2c 20 74 68 65 20 66 00000010 72 65 65 20 65 6e 63 79 63 6c 6f 70 65 64 69 61 00000020 20 74 68 61 74 20 61 6e 79 6f 6e 65 20 63 61 6e 00000030 20 65 64 69 74 0a
В контекстах, где основание неясно, шестнадцатеричные числа могут быть неоднозначными и их можно спутать с числами, выраженными в других основаниях. Существует несколько соглашений для однозначного выражения ценностей. Числовой индекс (который сам записан в десятичной системе счисления) может явно указывать основание: 159 10 — десятичное число 159; 159 16 — это шестнадцатеричное число 159, что равно 345 10 . Некоторые авторы предпочитают текстовый нижний индекс, например 159 десятичный и 159 шестнадцатеричный или 159 d и 159 h .
Дональд Кнут представил использование определенного шрифта для обозначения определенного основания в своей книге The TeXbook . [2] Шестнадцатеричные представления записаны там шрифтом пишущей машинки : 5А3.
В линейных текстовых системах, например тех, которые используются в большинстве сред компьютерного программирования, возникло множество методов:
0x
для числовых констант, представленных в шестнадцатеричном виде: 0x5A3
. Символьные и строковые константы могут выражать коды символов в шестнадцатеричном формате с префиксом, \x
за которым следуют две шестнадцатеричные цифры: '\x1B'
представляет управляющий символ Esc ; "\x1B[0m\x1B[25;1H"
представляет собой строку, содержащую 11 символов с двумя встроенными символами Esc. [3] Для вывода целого числа в шестнадцатеричном виде с помощью семейства функций printf используется код преобразования формата %X
или .%x
ode;
’
x
’
FFh
05A3H
0FFh
FFh
0x42
$
в качестве префикса: $5A3
.H'ABCD'
(для ABCD 16 ). Аналогично, Фортран 95 использует Z'ABCD'.16#5A3#
. Для констант битовых векторов VHDL использует обозначение x"5A3"
. [6]8'hFF
, где 8 — количество битов в значении, а FF — шестнадцатеричная константа.16r
16r5A3
16#
: 16#5A3
.#x
и #16r
. Установка переменных *read-base* [7] и *print-base* [8] в значение 16 также может использоваться для переключения считывателя и принтера системы Common Lisp на представление шестнадцатеричных чисел для чтения и печати чисел. Таким образом, шестнадцатеричные числа могут быть представлены без префиксного кода #x или #16r, если база ввода или вывода изменена на 16.&H
:&H5A3
&
шестнадцатеричный код. [10]0h
префикс:0h5A3
16r
для обозначения шестнадцатеричных чисел: 16r5a3
. Двоичные, четверичные (с основанием 4) и восьмеричные числа можно указать аналогичным образом.X'5A3'
, который используется в ассемблере, PL/I , COBOL , JCL. , скрипты, команды и другие места. Этот формат был распространен и в других (и уже устаревших) системах IBM. Иногда вместо апострофов использовались кавычки.Иногда известно, что числа шестнадцатеричные.
%
: http://www.example.com/name%20with%20spaces
где %20
— код пробела (пустого) символа, кодовая точка ASCII 20 в шестнадцатеричном формате, 32 в десятичном формате.U+
которым следует шестнадцатеричное значение, например U+20AC
, знак евро (€).#
: например, белый цвет представляется как #FFFFFF
. [11] CSS также допускает 3-шестнадцатеричные сокращения, по одной шестнадцатеричной цифре на компонент: #FA3
abbreviates #FFAA33
(золотисто-оранжевый: ).=
: Espa=F1a
is «España» (шестнадцатеричный код F1 — это код ñ в наборе символов ISO/IEC 8859-1). [12] )AA213FD51B3801043FBC
...:
). Это, например, действительный адрес IPv6: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
или сокращенно путем удаления начальных нулей 2001:db8:85a3::8a2e:370:7334
( адреса IPv4 обычно записываются в десятичном формате).3F2504E0-4F89-41D3-9A0C-0305E82C3301
.Использование букв от A до F для обозначения цифр выше 9 не было универсальным в ранней истории компьютеров.
Поскольку не существовало традиционных цифр для обозначения величин от десяти до пятнадцати, вместо них были повторно использованы буквы алфавита. В большинстве европейских языков отсутствуют недесятичные слова для некоторых цифр от одиннадцати до пятнадцати. Некоторые люди читают шестнадцатеричные числа по цифрам, например телефонный номер, или используют фонетический алфавит НАТО , Объединенный фонетический алфавит армии/флота или аналогичную специальную систему. После того как среди программистов IBM System/360 была принята шестнадцатеричная система счисления , Магнусон (1968) [23] предложил руководство по произношению, в котором шестнадцатеричным буквам давались короткие названия – например, «А» произносилась как «энн», «Б». bet», C «chris» и т. д. [23] Другая система именования была опубликована в Интернете Роджерсом (2007) [24] , которая пытается сделать вербальное представление различимым в любом случае, даже если фактическое число не содержит чисел A. –Ф. Примеры приведены в таблицах ниже. Еще одна система именования была разработана Бэббом (2015) на основе шутки из Кремниевой долины . [25]
Другие предложили использовать устную азбуку Морзе для выражения четырехбитных шестнадцатеричных цифр, где «дит» и «дах» обозначают ноль и единицу соответственно, так что «0000» произносится как «дит-дит-дит-дит» ( ....), да-дит-дит-да (-..-) озвучивает цифру со значением девять, а «да-да-да-да» (----) озвучивает шестнадцатеричную цифру для десятичной 15.
Системы счета цифр были разработаны как для двоичной, так и для шестнадцатеричной системы счисления. Артур Кларк предложил использовать каждый палец в качестве переключателя включения/выключения, позволяя считать пальцы от нуля до 1023 10 на десяти пальцах. [26] Другая система счета до FF 16 (255 10 ) показана справа.
Шестнадцатеричная система может выражать отрицательные числа так же, как и десятичная: −2A для обозначения −42 10 и так далее.
Шестнадцатеричное число также может использоваться для выражения точных битовых комбинаций, используемых в процессоре , поэтому последовательность шестнадцатеричных цифр может представлять собой значение со знаком или даже значение с плавающей запятой . Таким образом, отрицательное число -42 10 может быть записано как FFFF FFD6 в 32-битном регистре ЦП (в дополнении до двух ), как C228 0000 в 32-битном регистре FPU или C045 0000 0000 0000 в 64-битном FPU. регистр (в стандарте IEEE с плавающей запятой ).
Как десятичные числа могут быть представлены в экспоненциальной форме , так и шестнадцатеричные числа. В обозначении P используется буква P (или p для « степени»), тогда как E (или e ) служит аналогичной цели в десятичной записи E. Число после P является десятичным и представляет собой двоичную степень. Увеличение показателя степени на 1 умножает на 2, а не на 16: 20p0 = 10p1 = 8p2 = 4p3 = 2p4 = 1p5 . Обычно число нормализуется так, что шестнадцатеричные цифры начинаются с 1. (ноль обычно равен 0 без P ).
Пример: 1.3DEp42 представляет собой 1.3DE 16 × 2 42 10 .
Обозначение P требуется стандартом двоичных чисел с плавающей запятой IEEE 754-2008 и может использоваться для литералов с плавающей запятой в версии C99 языка программирования C. [27] Используя спецификаторы преобразования %a или %A , это обозначение может быть создано реализациями семейства функций printf в соответствии со спецификацией C99 [28] и единой спецификацией Unix (IEEE Std 1003.1) стандарта POSIX . [29]
Большинство компьютеров манипулируют двоичными данными, но людям сложно работать с большим количеством цифр даже для относительно небольшого двоичного числа. Хотя большинство людей знакомы с системой счисления по основанию 10, гораздо проще преобразовать двоичную систему в шестнадцатеричную, чем в десятичную, поскольку каждая шестнадцатеричная цифра соответствует целому числу битов (4 10 ). В этом примере число 1111 2 преобразуется в десятичное. Поскольку каждая позиция в двоичном числе может содержать либо 1, либо 0, ее значение можно легко определить по ее позиции справа:
Поэтому:
При небольшой практике сопоставление 1111 2 с F 16 за один шаг становится простым: см. таблицу в письменном виде. Преимущество использования шестнадцатеричного числа вместо десятичного быстро возрастает с увеличением размера числа. Когда число становится большим, преобразование в десятичное становится очень утомительным. Однако при отображении в шестнадцатеричный формат двоичную строку легко рассматривать как группы из 4 цифр и сопоставлять каждую из них с одной шестнадцатеричной цифрой. [30]
В этом примере показано преобразование двоичного числа в десятичное, сопоставление каждой цифры с десятичным значением и сложение результатов.
Сравните это с преобразованием в шестнадцатеричный формат, где каждую группу из четырех цифр можно рассматривать независимо и конвертировать напрямую:
Преобразование шестнадцатеричного формата в двоичный также является прямым. [30]
Хотя четверичная система (основание 4) используется мало, ее можно легко преобразовать в шестнадцатеричную или двоичную систему и обратно. Каждая шестнадцатеричная цифра соответствует паре четверичных цифр, а каждая четверичная цифра соответствует паре двоичных цифр. В приведенном выше примере 5 E B 5 2 16 = 11 32 23 11 02 4 .
Восьмеричную систему (с основанием 8) также можно преобразовать сравнительно легко, хотя и не так тривиально, как с базами 2 и 4. Каждая восьмеричная цифра соответствует трем двоичным цифрам, а не четырем . Таким образом, мы можем конвертировать восьмеричные и шестнадцатеричные числа с помощью промежуточного преобразования в двоичные числа с последующей перегруппировкой двоичных цифр в группы по три или четыре.
Как и во всех системах счисления, существует простой алгоритм преобразования представления числа в шестнадцатеричное путем выполнения операций целочисленного деления и остатка в исходной базе. Теоретически это возможно с любой системой счисления, но для большинства людей с помощью этого метода можно легко обрабатывать только десятичную систему счисления, а для большинства компьютеров - только двоичную (которая может быть преобразована гораздо более эффективными методами).
Пусть d — шестнадцатеричное число, а ряд h i h i−1 ...h 2 h 1 — шестнадцатеричные цифры, представляющие это число.
«16» можно заменить любым другим основанием по желанию.
Ниже представлена реализация описанного выше алгоритма на языке JavaScript для преобразования любого числа в шестнадцатеричное в строковом представлении. Его цель — проиллюстрировать приведенный выше алгоритм. Однако для серьезной работы с данными гораздо целесообразнее работать с побитовыми операторами .
функция toHex ( d ) { var r знак равно d % 16 ; if ( d - r == 0 ) { return toChar ( r ); } return toHex (( d - r ) / 16 ) + toChar ( r ); } function toChar ( n ) { const Alpha = "0123456789ABCDEF" ; вернуть альфу . charAt ( n ); }
Также возможно выполнить преобразование, назначив каждому месту в исходной базе шестнадцатеричное представление его значения — перед выполнением умножения и сложения для получения окончательного представления. Например, чтобы преобразовать число B3AD в десятичное, можно разбить шестнадцатеричное число на его цифры: B (11 10 ), 3 (3 10 ), A (10 10 ) и D (13 10 ), а затем получить итоговое число. результат умножения каждого десятичного представления на 16 p ( p — соответствующая позиция шестнадцатеричной цифры, считая справа налево, начиная с 0). В данном случае мы имеем следующее:
B3AD = (11 × 16 3 ) + (3 × 16 2 ) + (10 × 16 1 ) + (13 × 16 0 )
это 45997 по основанию 10.
Многие компьютерные системы предоставляют утилиту-калькулятор, способную выполнять преобразования между различными системами счисления, часто включая шестнадцатеричные.
В Microsoft Windows утилиту « Калькулятор » можно перевести в режим «Программист», который позволяет осуществлять преобразование между системами счисления 16 (шестнадцатеричное), 10 (десятичное), 8 ( восьмеричное ) и 2 ( двоичное ) — системами счисления, наиболее часто используемыми программистами. В режиме программирования экранная цифровая клавиатура содержит шестнадцатеричные цифры от A до F, которые активны, когда выбрано «Hex». Однако в шестнадцатеричном режиме калькулятор Windows поддерживает только целые числа.
Элементарные операции, такие как сложение, вычитание, умножение и деление, могут выполняться косвенно путем преобразования в альтернативную систему счисления , например, в широко используемую десятичную систему или двоичную систему, где каждая шестнадцатеричная цифра соответствует четырем двоичным цифрам.
Альтернативно, можно также выполнять элементарные операции непосредственно внутри самой шестнадцатеричной системы, полагаясь на ее таблицы сложения/умножения и соответствующие стандартные алгоритмы, такие как деление в столбик и традиционный алгоритм вычитания.
Как и в других системах счисления, шестнадцатеричная система может использоваться для представления рациональных чисел , хотя повторяющиеся расширения являются обычным явлением, поскольку шестнадцать (10 16 ) имеет только один простой делитель: два.
Для любой системы счисления 0,1 (или «1/10») всегда эквивалентно единице, разделенной на представление этого базового значения в его собственной системе счисления. Таким образом, при делении одной на два для двоичной системы или на шестнадцать для шестнадцатеричной дроби обе эти дроби записываются как 0.1
. Поскольку система счисления 16 представляет собой полный квадрат (4 2 ), дроби, выраженные в шестнадцатеричном формате, имеют нечетный период гораздо чаще, чем десятичные, и не существует циклических чисел (кроме тривиальных однозначных цифр). Повторяющиеся цифры отображаются, когда знаменатель в наименьших терминах имеет простой множитель , не найденный в системе счисления; таким образом, при использовании шестнадцатеричной записи все дроби со знаменателями, не являющимися степенью двойки , приводят к бесконечной строке повторяющихся цифр (например, третей и пятых). Это делает шестнадцатеричное (и двоичное) менее удобным, чем десятичное, для представления рациональных чисел, поскольку большая часть находится за пределами диапазона конечного представления.
Все рациональные числа, конечно представимые в шестнадцатеричной системе счисления, также конечно представимы в десятичной, двенадцатеричной и шестидесятеричной системе счисления : то есть любое шестнадцатеричное число с конечным числом цифр также имеет конечное число цифр, если оно выражено в этих других системах счисления. И наоборот, только часть тех, которые конечно представимы в последних базисах, конечно представимы в шестнадцатеричном виде. Например, десятичное число 0,1 соответствует бесконечному повторяющемуся представлению 0,1 9 в шестнадцатеричном формате. Однако шестнадцатеричная система более эффективна, чем двенадцатеричная и шестидесятеричная, для представления дробей со степенью двойки в знаменателе. Например, 0,0625 10 (одна шестнадцатая) эквивалентно 0,1 16 , 0,09 12 и 0;3,45 60 .
В таблице ниже даны разложения некоторых распространенных иррациональных чисел в десятичной и шестнадцатеричной форме.
Степени двойки имеют очень простое разложение в шестнадцатеричном формате. Первые шестнадцать степеней двойки показаны ниже.
Традиционными китайскими единицами измерения были шестнадцатеричные. Например, один джин (斤) в старой системе равен шестнадцати таэлям . Суанпан (китайские счеты ) можно использовать для выполнения шестнадцатеричных вычислений, таких как сложение и вычитание . [31]
Как и в случае с двенадцатеричной системой счисления, время от времени предпринимались попытки сделать шестнадцатеричную систему счисления предпочтительной. Эти попытки часто предлагают определенное произношение и символы для отдельных цифр. [32] Некоторые предложения объединяют стандартные меры так, что они кратны 16. [33] [34] Раннее такое предложение было выдвинуто Джоном В. Нистромом в «Проекте новой системы арифметики, веса, меры и монет: предложено». называться Тональной системой с шестнадцатью в основе , опубликованной в 1862 году. [35] Нистром, среди прочего, предложил шестнадцатеричное время , которое делит день на 16, так что получается 16 «часов» (или «10 тимов », произносится тонтим ) через день. [36]
Слово «шестнадцатеричный» впервые упоминается в 1952 году. [37] Оно является макаронным в том смысле, что сочетает в себе греческое ἕξ (шестнадцатеричное) «шесть» с латинским -десятичным . Полностью латинская альтернативная шестидесятеричная система счисления (сравните слово « шестидесятеричная » для системы счисления по основанию 60) старше и, по крайней мере, время от времени используется с конца 19 века. [38] Он до сих пор используется в документации Bendix в 1950-х годах . Шварцман (1994) утверждает, что использования шестнадцатеричного числа можно было избежать из-за его наводящего на размышления сокращения обозначения пола . [39] Многие западные языки с 1960-х годов приняли термины, эквивалентные по образованию шестнадцатеричной системе счисления (например, французский шестнадцатеричный , итальянский esadecimale , румынский шестнадцатеричный , сербский шестнадцатеричный и т. д.), но другие ввели термины, которые заменяют «шестнадцать» родными словами (например, греческий). δεκαεξαδικός, исландский секстандакерфи , русский шестнадцатеричной и др.)
Терминология и обозначения не устоялись до конца 1960-х годов. Дональд Кнут в 1969 году утверждал, что этимологически правильным термином будет семеричный или, возможно, семерный термин, латинский термин, предназначенный для обозначения «сгруппированного по 16» по образцу двоичного , троичного , четверичного и т. Д. Согласно аргументу Кнута, правильные термины для десятичных и восьмеричных чисел арифметика будет десятичной и восьмеричной соответственно. [40] Альфред Б. Тейлор использовал сединарную систему в своей работе середины 1800-х годов по альтернативным основаниям счисления, хотя он отверг основание 16 из-за ее «неудобного количества цифр». [41] [42]
Нынешняя нотация с использованием букв от A до F становится фактическим стандартом, начиная с 1966 года, после публикации руководства Fortran IV для IBM System/360 , которое (в отличие от более ранних вариантов Fortran) признает стандарт для ввода шестнадцатеричных констант. [43] Как отмечалось выше, альтернативные обозначения использовались NEC (1960) и The Pacific Data Systems 1020 (1964). Стандарт, принятый IBM, похоже, получил широкое распространение к 1968 году, когда Брюс Алан Мартин в своем письме редактору CACM жаловался , что
С нелепым выбором букв A, B, C, D, E, F в качестве символов шестнадцатеричных чисел, усугубляющих и без того неприятные проблемы различения восьмеричных (или шестнадцатеричных) чисел от десятичных чисел (или имен переменных), пришло время пересмотреть наши цифровые символы. Это нужно было сделать до того, как плохой выбор превратился в стандарт де-факто!
Аргумент Мартина заключался в том, что использование цифр от 0 до 9 в недесятичных числах «подразумевает для нас схему десятичных разрядов»: «Почему бы не использовать совершенно новые символы (и имена) для семи или пятнадцати ненулевых цифр, необходимых в восьмеричных или шестнадцатеричных числах». ... Даже использование букв от А до Р было бы улучшением, но совершенно новые символы могли бы отразить бинарную природу системы». [19] Он также утверждал, что «повторное использование букв алфавита для числовых цифр представляет собой гигантский шаг назад по сравнению с изобретением отдельных, неалфавитных глифов для цифр шестнадцать столетий назад» (как цифры Брахми , а позже в индуистско-арабских цифрах). system ), и что последние стандарты ASCII (ASA X3.4-1963 и USAS X3.4-1968) «должны были сохранить шесть позиций кодовой таблицы после десяти десятичных цифр, а не заполнять их без необходимости знаками пунктуации» (« ::<=>?"), которое могло быть размещено в другом месте среди 128 доступных позиций.
Base16 (как имя собственное без пробела) также может относиться к кодировке двоичного текста, принадлежащей к тому же семейству, что и Base32 , Base58 и Base64 .
В этом случае данные разбиваются на 4-битные последовательности, и каждое значение (от 0 до 15 включительно) кодируется с помощью одного из 16 символов из набора символов ASCII . Хотя можно использовать любые 16 символов из набора символов ASCII, на практике всегда выбираются цифры ASCII «0» – «9» и буквы «A» – «F» (или строчные буквы «a» – «f»). для соответствия стандартным письменным обозначениям шестнадцатеричных чисел.
Кодировка Base16 имеет несколько преимуществ:
Основными недостатками кодировки Base16 являются:
Поддержка кодировки Base16 широко распространена в современных компьютерах. Это основа стандарта W3C для процентного кодирования URL-адресов , где символ заменяется знаком процента «%» и его формой в кодировке Base16. Большинство современных языков программирования напрямую включают поддержку форматирования и анализа чисел в кодировке Base16.
{{cite book}}
: CS1 maint: location missing publisher (link)"\x1B[0m\x1B[25;1H"
определяет последовательность символов Esc [ 0 m Esc [ 2 5; 1 Ч Ноль . Это escape-последовательности, используемые на терминале ANSI , которые сбрасывают набор символов и цвет, а затем перемещают курсор на строку 25.&
префикс восьмеричных значений. (Microsoft BASIC в основном использует &O
восьмеричный префикс и &H
шестнадцатеричный префикс, но сам по себе амперсанд интерпретируется по умолчанию как восьмеричный префикс.Эта база используется потому, что группа из четырех битов может представлять любое из шестнадцати различных чисел (от нуля до пятнадцати).
Присвоив символ каждой из этих комбинаций, мы приходим к системе записи, называемой шестидесятеричной (в разговоре обычно шестнадцатеричной, потому что никто не хочет сокращать пол).
Символами шестнадцатеричного языка являются десять десятичных цифр, а на пишущей машинке G-15 — буквы u, v, w, x, y и z.
Это произвольные обозначения;
другие компьютеры могут использовать другие символы алфавита для этих последних шести цифр.