+ -
当前位置:首页 → 问答吧 → 请帮忙看一下,一个输出

请帮忙看一下,一个输出

时间:2010-08-18

来源:互联网

本帖最后由 xdshting 于 2010-08-18 11:22 编辑
  1. unsigned int a=0xfffffff7;
  2.          unsigned char i=(unsigned char)a;
  3.           char *b=(char *)&a;
  4.           printf("%08x,%08x",i,*b);
复制代码
程序的输出是
0000007f  fffffff7
第一个输出可以理解,就是把溢出的位去掉,其余的直接装到 i 中
第二个想不清楚,b已经指向整个整数,*b的话应该只输出,整数中的一个字节啊,怎么会输出fffffff7呢?
谢谢

环境 x86,fedora,gcc

作者: xdshting   发布时间: 2010-08-18

%08x

作者: efolzl   发布时间: 2010-08-18

%x默认是按照整形大小输出的。

作者: davelv   发布时间: 2010-08-18



QUOTE:
%08x
efolzl 发表于 2010-08-18 11:17




    %08x我试过了,是16进制,无符号打印
而且,如果直接给他f7的话,它打印的就是000000f7啊

作者: xdshting   发布时间: 2010-08-18



QUOTE:
%x默认是按照整形大小输出的。
davelv 发表于 2010-08-18 11:20




    按整形大小输出应该补0才是啊,总不能补 f 吧

作者: xdshting   发布时间: 2010-08-18

意思是它把b指向的地址当成int* 而不是char*.

作者: davelv   发布时间: 2010-08-18

因为 *b是char,f7符号扩展就成fffffff7了,凑巧与a相等而已
改成
unsigned char *b=(char *)&a;
就可以了。

作者: hellioncu   发布时间: 2010-08-18

char *b=(char *)&a;
是不是这一句你本想用
unsigned char *b=(char *)&a;

这应该是你要的结果

作者: zliming   发布时间: 2010-08-18