Вы не можете заставить printf конвертировать 'F' в 255 без чёрной магии.Printf преобразует символ в другие представления, но не меняет его значение.Это может показать, как работает преобразование символов:
printf("Char %c is decimal %i (0x%X)\n", 'F', 'F', 'F');
printf("The high order bits are ignored: %d: %X -> %hhX -> %c\n",
0xFFFFFF46, 0xFFFFFF46, 0xFFFFFF46, 0xFFFFFF46);
производит
Char F is decimal 70 (0x46)
The high order bits are ignored: -186: FFFFFF46 -> 46 -> F
Да, я знаю, что вы спрашивали о sprintf, но этоне покажет вам ничего, пока вы не сделаете другую печать.
Идея состоит в том, что каждый общий целочисленный параметр для printf помещается в стек (или в регистр) путем повышения.Это означает, что он расширен до самого большого общего размера: байты, символы и шорты преобразуются в int путем расширения знака или дополнения нулями.Это сохраняет список параметров в стеке в разумном состоянии.Это хорошее соглашение, но, вероятно, оно возникло в 16-битной ориентации слова в стеке на PDP-11 (где все это началось).
В библиотеке printf (на приемном концеcall), код использует спецификатор формата, чтобы определить, какая часть параметра (или вся) обрабатывается.Поэтому, если формат «% c», используются только 8 бит.Обратите внимание, что между системами могут существовать некоторые различия в том, как «продвигаются» шестнадцатеричные константы.Но если значение, большее чем 255, передается в преобразование символов, старшие биты игнорируются.