首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

整形指针到字符指针的变换的疑惑

2013-10-29 
整形指针到字符指针的转换的疑惑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?
[解决办法]
引用:
int main() {
unsigned int a = 0xfffffff7;//改成0xffffff07;
unsigned char b = (unsigned char)a;
char* c = (char*)&a;
printf("%08x",*c);//输出0xfffffff7==》00000007
}

转换为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; 
}

[解决办法]
引用:
int main() {
unsigned int a = 0xfffffff7;
unsigned char b = (unsigned char)a;
char* c = (char*)&a;
printf("%08x",*c);//输出0xfffffff7
}

转换为char*后不应该是去其地址开始的一个字节吗,为什么还会输出0xfffffff7?

楼主其实始终要记住一点,强制类型转化不会改变被转换对象本身的类型,只是将其转换成相应的类型赋值给其他变量而已,所以&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
}

热点排行