Здесь у меня есть короткая программа, ниже которой сделано какое-то явное приведение.Почему подписка коротко расширена до 4 байтов?
#include <stdio.h>
#include <string.h>
int main()
{
unsigned int x = 0xDEADBEEF;
unsigned short y = 0xFFFF;
printf("%x\n", y);
if (x > (signed short) y)
printf("true.\n");
else{
printf("false.\n");
printf("(signed short)=%x\n", (signed short) y);
printf("(unsigned int) (signed short)=%x\n", (unsigned int) (signed short) y);
printf("(unsigned) (signed short)=%x\n", (unsigned) (signed short)y);
}
return 0;
}
И я получил информацию ниже.
Compiling the source code....
$gcc main.c -o demo
Executing the program....
$demo
ffff
false.
(signed short)=ffffffff
(unsigned int) (signed short)=ffffffff
(unsigned) (signed short)=ffffffff
Я так смущен, почему y стал 0xffffffff, когда он был отброшен до подписанного. Короткий тип должен быть 2 байта, а не 4 байта.
printf() не является отладчиком. –
'x> (подписанный короткий) y' может не означать, что вы думаете. –
Итак, для строки «x> (подписанный короткий) y», y сначала преобразуется в тип «подписанный короткий», который остается 0xffff (= -1) в памяти. И тогда y неявно приводится к «unsigned int». Таким образом, y становится «int» 0xffffffff (= -1), а затем «unsigned int» 0xffffffff (= UTMax). Правильно ли я так думать? – EBADF