C语言里有点不明白了。关于补码的有关问题

C语言里有点不明白了。。。。。关于补码的问题
代码:
#include<stdio.h>
int main(int argc ,char** argv)
{
unsigned int a = 0xfffffff7;
unsigned char* i = (unsigned char*)&a;
char* b = (char*)&a;
printf("%x,%x",*i,*b);
}


机器是小端模式 
打印出来结果是 : f7, fffffff7
我想问的是为什么,是不是两者取的数都是 0xf7,为什么*b是fffffff7 为什么从8位变成32位了~

水了 ,不明白了~555555

------解决方案--------------------
http://user.qzone.qq.com/549838127/infocenter#!app=2&via=QZ.HashRefresh&pos=1337363194
一次性明白补码
------解决方案--------------------
%x 是答应无符号int的 自然是 fffffff7
------解决方案--------------------
楼主搜索一下 C语言类型提升

好好看看,挺麻烦的

其实每次我看了也都记不住

在工程实践中尽量避免出现这样纠结的代码吧
------解决方案--------------------
%x格式默认输出数据是int,表达式转换为int
unsigned char *i是8位无符号的,转换为int32位时前补0--不输出前置0
char *b是8位有符号的,轮换为int32位时前补1----自然就输出了前置的1了(每四个1变换为一个f)
------解决方案--------------------
一切最后都要回归到汇编级别去思考
------解决方案--------------------
%x,%X 是按16进制输出 unsigned int; 不同是数据类型的隐式转换造成的,

unsigned int a = 0x7ffffff7;

看看输出什么
------解决方案--------------------
#include<stdio.h>
int main(int argc ,char** argv)
{
unsigned int a = 0xfffffff7;
unsigned char* i = (unsigned char*)&a;
char* b = (char*)&a;
printf("%x,%x",*i,*b);
}
说点自己的想法吧

0xfffffff7 这个数字,转换成char 以后 内存是这样的由低位到高位 f7 ff ff ff ff ff ff ff
printf 中使用 %x的时候 后面相应的参数会当作int类型
unsigned char *i
printf("%x", *i);
这个函数是这样工作的。首先unsigned char = *i;
然后 int tmp = *i;
然后就变成了 printf("%x", tmp);
下面来看tmp 的值 因为ch = 0xf7.并且ch是一个unsigned的类型,
因此 tmp 扩展后在内存中应该是这样的,由低位到高位 f7 00 00 00 00
所以打印出来就是f7

再看char *b
printf("%x", *b);
首先会有一个
char ch = *i;
但由于*i不是unsigned类型, 那么ch存储的应该是其补码
f7的补码为 1000 1001
然后int tmp = ch;
这里再把ch看为负数,
那么tmp的值首先为 1000 0000 0000 0000 0000 0000 0000 1001
然后补码为 ff ff ff f7
就是打印的值了。