2013-08-18 65 views
2

代码:如何解释一个C程序的这个输出

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

输出为:fffffff7。 我的机器是little-endian。当然我知道*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询问值b指针(F7)

  2. %08x是要求十六进制,打印一个字符作为整数型时,它是打印前扩展为int。 (FFFFFF7现在)

+4

nope。b指向F7而不是FF – TGO

+0

@TGO对不起,这个stuip错误 –

+0

重要的是,你已经整理出来:) – TGO