См. Раздел 6.4.4.4, пункт 10 стандарта C99:
Целочисленная символьная константа имеет тип int
. Значение целочисленной символьной константы
содержащий один символ, который отображается на однобайтовый символ выполнения
Числовое значение представления сопоставленного символа интерпретируется как целое число.
Значение целочисленной символьной константы, содержащей более одного символа (например,
'ab'
) или содержит символ или escape-последовательность, которая не отображается в однобайтовый
символ выполнения, определяется реализацией. Если целочисленная символьная константа содержит
одиночный символ или escape-последовательность, его значение является тем, которое получается, когда объект с
тип char
, значение которого равно значению одиночного символа или escape-последовательности, преобразуется в
тип int
.
Напомним, что определенный реализацией означает, что реализация (в данном случае компилятор C) может делать все, что захочет, но это должно быть документировано .
Большинство компиляторов преобразуют его в целочисленную константу, соответствующую конкатенации октетов, соответствующих отдельным символам, но порядковый номер может быть как младшим, так и старшим, в зависимости от порядкового номера целевой архитектуры.
Следовательно, переносимый код не должен использовать многосимвольные константы, а вместо этого должен использовать простые интегральные константы. Вместо 'abcd'
, который может иметь либо порядковый номер, используйте либо 0x61626364, либо 0x64636261, которые имеют известные порядковые номера (большой и маленький соответственно).