整形指针到字符指针的转换的疑惑int main() {unsigned int a 0xfffffff7unsigned char b (unsigned c
整形指针到字符指针的转换的疑惑
int main() {
unsigned int a = 0xfffffff7;
unsigned char b = (unsigned char)a;
char* c = (char*)&a;
printf("%08x",*c);//输出0xfffffff7
}
转换为char*后不应该是去其地址开始的一个字节吗,为什么还会输出0xfffffff7?
[解决办法]因为 00xF7 =247 ,这个数据超过127, 是个负数即 -9 作为参数传递时,转换成整型,表示的-9, 又变成0xfffffff7了。
于是输出0xfffffff7
这里关键是
1)%d 参数按照整型输出,
%x ===>int ,unsigned int,
%u ===>unsigned int
2)参数传递时,要先转换,再输出。
char ,short int ,void * -->int ,unsigned char,
unsigned short,unsigned int -->int
这样,不论输出,还是参数传递,都是0xfffffff7 ,当然输出0xfffffff7 了
要不这么输出:
//printf("%08hhx",*c);
格式对应关系:
//%hhd,%hhx,%hhu ==> char;char,unsigned char;unsigned char;
//%lld,%llx,%llu ===>long long;long long unsigned long long;unsigned long long;
//%hd,%hx,%hu ===>short;short,unsigned short;unsigned short;
//%ld,%lx,%lu ===>long;long, unsigned long;unsigned long;
//%d,%x,%u ===>int;int, unsigned int;unsigned int;
d,10进制格式,带符号
x,16进制格式,带符号,无符号, 通用。
u,10进制格式,无符号
hh-->short short ==>char,unsigned char
ll-->long long ==>long long;unsigned long long
h--->short
l--->long
改成这个看输出啥:
int main() {
unsigned int a = 0xfffffff7;
unsigned char b = (unsigned char)a;
char* c = (char*)&a;
printf("%08hhx",*c);//输出0x000000f7
return 0;
}
[解决办法]楼主其实始终要记住一点,强制类型转化不会改变被转换对象本身的类型,只是将其转换成相应的类型赋值给其他变量而已,所以&a依旧是指向int的;char* c = (char*)&a;这句虽然把&a转换成char *后赋值给了c,但是printf("%08x",*c);在打印输出的时候是以%08x格式输出,默认只整形,你可以printf("%08x",(char)*c);来打印一个字节
[解决办法]int main() {
unsigned int a = 0xfffffff7;
unsigned char b = (unsigned char)a;
char* c = (char*)&a;
printf("%08x",(unsigned char)*c);//输出000000f7
}