2014-10-15 2 views
1

Здесь у меня есть короткая программа, ниже которой сделано какое-то явное приведение.Почему подписка коротко расширена до 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 байта.

+0

printf() не является отладчиком. –

+0

'x> (подписанный короткий) y' может не означать, что вы думаете. –

+0

Итак, для строки «x> (подписанный короткий) y», y сначала преобразуется в тип «подписанный короткий», который остается 0xffff (= -1) в памяти. И тогда y неявно приводится к «unsigned int». Таким образом, y становится «int» 0xffffffff (= -1), а затем «unsigned int» 0xffffffff (= UTMax). Правильно ли я так думать? – EBADF

ответ

2

Код формата "%x"printf для int и не short, за который вы хотите "%hx".

1

Во-первых, short тип может быть любого размера, ваш компилятор хочет, в пределах ограничений спецификации C, так short переменные не гарантируется быть ровно 2 байта.

То, что вы видите, является расширением знака , вызванным повышением до более крупного числового типа.

Число 0xffff отличное как подписанное 2-байтовое число в дополнении 2 представляет собой число -1. Когда вы применяете это к большему типу данных, числовое значение должно быть сохранено, поэтому знак расширяется; 0xffffffff литой как подписанный 4-байтовый номер также -1. (0x0000ffff, выполненный как подписанное 4-байтовое число, будет 65 535, что не совпадает с номером.)

Смежные вопросы