Из главы 2 (подраздел 2.3 под названием «Константы») книги K&R по языку программирования C:
Определенные символы могут быть представлены в символьных и строковых константах с помощью управляющих последовательностей, таких как \n (новая строка); эти последовательности выглядят как два символа, но представляют только один. Кроме того, битовая комбинация произвольного размера в байтах может быть указана с помощью
′\ooo′
где ooo — от одной до трех восьмеричных цифр (0...7) или
′\xhh′
где hh — одна или несколько шестнадцатеричных цифр (0...9, a...f, A...F). Так что мы могли бы написать
#define VTAB ′\013′ /* ASCII vertical tab */
#define BELL ′\007′ /* ASCII bell character */
or, in hexadecimal,
#define VTAB ′\xb′ /* ASCII vertical tab */
#define BELL ′\x7′ /* ASCII bell character */
Меня смущают следующие формулировки (выделено мной): где ooo — от одной до трех восьмеричных цифр (0...7). Если есть три восьмеричных цифры, требуемое количество битов будет 9 (3 для каждой цифры), что превышает длину байта, необходимую для символов. Наверняка я что-то здесь упускаю. Что мне не хватает?
which exceeds the byte length required for characters
. неправильно. Машины могут иметь 9-битные символы. Или 7 бит. (или даже 16 бит) '\377' - это только константы, служащие инициализаторами. Компилятор всегда может пожаловаться, если значения не помещаются в машинный символ. - person wildplasser   schedule 09.08.2013