关于printf的一些问题

C语言 码拜 8年前 (2017-04-18) 1119次浏览
今天早上一个朋友让本人调试一段代码.

#include<stdio.h>
void main()
{
    char a[8] = {1,20,30,40,50,60,70,80};
    char * p =a; 
    int c = 0x12345678;
    char d = 0xee;
    char *p1 = &c; 
    char *p2 = &d; 
    printf("%x\n",a);
    printf("%x\n",p);
    printf("%x\n",p+1);
    printf("%x\n",p+2);
    printf("****************\n");
    printf("C address = %x\n",&c);
    printf("D address = %x\n",&d);
    printf("%x\n",*p1);
    printf("%x\n",*(p1+1));
    printf("%x\n",*(p1+2));
    printf("%x\n",*(p1+3));
    printf("%x\n",d);
    printf("%x\n",*(p1-1));
}

它的输出结果是这样的:
关于printf的一些问题
先不考虑这代码能否合理
本人想不通啊,*(p1+1)与*(p1-1)没什么不同啊,为啥输出的结果却完全不一样啊,按本人的推测,它应该输出的是一个8bit数据,但*(p1-1)输出的却是32位的数据.所以想不通啊.

解决方案

70

%x输出的本来就是32位的,而且是按无符号的,也就是正数
*(p1+1) 之所以只显示了两个数字是原因是前面6个数字都为0
*(p1-1) 结果刚好是一个负数,而%x按无符号输出的,转换成在无符号数结果就成了那样

5

引用:
Quote: 引用:

%x的问题吧,它默认本来就是输出32位整数

是的啊,它是32位的,但是为什么类型一样,长度一样的两个参数会有两种不同的输出结果呢.

本人在8楼说的,你没做吗。那本人告诉你一个秘密,大于0x7f的char转unsigned会补1, 其余的补0


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于printf的一些问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)