Как уже говорили другие, \x
- это escape-последовательность, которая запускает "hexadecimal-escape-sequence".
Некоторые дополнительные сведения из стандарта C99:
При использовании внутри набора одинарных кавычек ('
) символы являются частью "целочисленной символьной константы", которая (6.4.4.4/2 "Символьные константы"):
последовательность из одного или нескольких многобайтовых символов, заключенных в одинарные кавычки, как в 'x'
.
и
Целочисленная символьная константа имеет тип int. Значение целочисленной символьной константы, содержащей один символ, который отображается на однобайтовый исполнительный символ, является числовым значением представления сопоставленного символа, интерпретируемого как целое число. Значение целочисленной символьной константы, содержащей более одного символа (например, 'ab'
), или содержащей символ или escape-последовательность, которая не отображается на однобайтовый символ выполнения, определяется реализацией.
Итак, последовательность в вашем примере '\xeb\x2a'
является значением, определяемым реализацией. Вероятно, это будет значение int 0xeb2a
или 0x2aeb
, в зависимости от того, является ли целевая платформа старшим или младшим порядком байтов, но вам нужно наверняка взглянуть на документацию своего компилятора.
При использовании внутри набора двойных кавычек ("
) символы, указанные в hex-escape-последовательности, являются частью строкового литерала с нулевым символом в конце.
Из стандарта C99 6.4.5 / 3 «Строковые литералы»:
Те же соображения применимы к каждому элементу последовательности в литерале символьной строки или литерале широкой строки, как если бы он был в целочисленной символьной константе или в символьной константе, за исключением того, что одиночная кавычка '
может быть представлена либо сам по себе или с помощью escape-последовательности \'
, но двойная кавычка "
должна быть представлена escape-последовательностью \"
.
Дополнительная информация:
На мой взгляд, вам следует избегать использования «многосимвольных» констант. Есть только несколько ситуаций, в которых они предоставляют какое-либо значение по сравнению с использованием обычной старой постоянной int
. Например, '\xeb\x2a'
может быть более переносимым, может быть указано как 0xeb2a
или 0x2aeb
в зависимости от того, какое значение вы действительно хотите.
Одна область, в которой я нашел полезными многосимвольные константы, - это поиск умных значений enum, которые можно распознать в отладчике или дампе памяти:
enum CommandId {
CMD_ID_READ = 'read',
CMD_ID_WRITE = 'writ',
CMD_ID_DEL = 'del ',
CMD_ID_FOO = 'foo '
};
Существует несколько проблем с переносимостью (кроме платформ с маленькими целочисленными значениями или предупреждениями, которые могут быть выброшены). Независимо от того, попадают ли символы в значения перечисления в форме с прямым или младшим порядком байтов, код все равно будет работать (если только вы не выполняете какие-то еще действия со значениями перечисления). Если символы заканчиваются в значении с использованием порядка байтов, который не соответствует ожидаемому, это может сделать значения менее удобными для чтения в отладчике, но на «правильность» это не повлияет.