начиная с фрагмента псевдокода:
char a = 0x80;
unsigned short b;
b = (unsigned short)a;
printf ("0x%04x\r\n", b); // => 0xff80
В моем нынешнем понимании "char" по определению не является ни символом со знаком, ни символом без знака, а своего рода третьим типом подписи.
как получилось, что «а» сначала расширяется от (возможно, в зависимости от платформы) 8-битного хранилища до (возможно, опять-таки, для конкретной платформы) 16 битов подписанного короткого замыкания, а затем преобразуется в неподписанное короткое замыкание?
существует ли стандарт c, который определяет порядок расширения?
Содержит ли это стандартное руководство каким-либо образом о том, как бороться с тем третьим типом подписи, которым является "чистый" символ (я назвал его один раз X-символом, x для неопределенной подписи), чтобы результаты были по меньшей мере детерминированными?
PS: если вставить оператор «(unsigned char)» перед «а» в строке назначения, то результат в строке печати действительно изменится на 0x0080. таким образом, только два приведения типов подряд обеспечат ожидаемый результат для определенных намерений.