2013-08-18 3 views
2

Код:Как объяснить этот вывод программы C

int main() 
{ 
    unsigned int a = 0xfffffff7; 
    char *b = (char *)&a; 
    printf("%08x",*b); 
} 

выход: fffffff7. Моя машина малоподвижная. Конечно, я знаю, что *b равно 0xf7, но я не знаю, почему вывод printf() выглядит следующим образом.

+6

Что вы ожидали? – TGO

+1

'% 08x' запрашивает шестнадцатеричный символ шириной 8 символов с начальными нулями. И при печати символа в виде целочисленного типа перед печатью он расширяется до int. –

+0

Почему выход не 000000f7 –

ответ

4

Поскольку система мало-младшему, a хранится в памяти как F7 FF FF FF.

b указывает на первый байт a. (F7)

*b оценивает на char. (F7)

*b способствует к int для того, чтобы передать его в качестве параметра, так как это типа char (который обычно по умолчанию signed char), то по знаку, чтобы стать FFFFFFF7.

1
+-----------------------+ 
| F7 <--b=(char *) &a| 
| FF     | 
| FF     | 
| FF     | 
|      | 
+-----------------------+ 


printf("%08x",*b); 

// означает:

  1. *b просит указатель значения б к (F7)

  2. %08x которая запрашивает гекс, при печати символа в виде целого типа это до печати. (FFFFFF7 Сейчас)

+4

nope. b указывает на F7 не FF – TGO

+0

@TGO Извините за ошибку в этой игре. –

+0

Важно то, что вы разобрали ее :) – TGO