诡异的输出,求解

Hyacinyh 2011-06-28 08:08:10
#include <stdio.h>

typedef char *byte_pointer;

void show_bytes(byte_pointer x, unsigned len)
{
unsigned i;
for (i = 0; i < len; i++) {
printf("%.2x ", x[i]);
}
printf("\n");
}

int main(void)
{
int num = 3233;
show_bytes((byte_pointer)&num, sizeof(int));
return 0;
}
两种以上的输出结果:
A. num = 3222时,输出:ffffffa1 0c 00 00
B. num = 30000时,输出: 30 75 00 00

为什么会这样呢?
...全文
90 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hyacinyh 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jixingzhong 的回复:]
printf("%.2x ", x[i]&0xff);
[/Quote]

谢谢您的回答,我明白了!
Hyacinyh 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ljljlj 的回复:]
有符号8位0xa1扩展成整型,放入printf()的参数。
因为它是个负数,所以扩展成整型就变成0xffffffa1了,如果是无符号数,那它就扩展成0x000000a1,
按%.2解释成unsigned char时候就会变成0xa1了。
[/Quote]

谢谢你耐心的解释,终于明白了,呵呵,太感谢了!!
jixingzhong 2011-06-28
  • 打赏
  • 举报
回复
printf("%.2x ", x[i]&0xff);
ljhhh0123 2011-06-28
  • 打赏
  • 举报
回复
有符号8位0xa1扩展成整型,放入printf()的参数。
因为它是个负数,所以扩展成整型就变成0xffffffa1了,如果是无符号数,那它就扩展成0x000000a1,
按%.2解释成unsigned char时候就会变成0xa1了。
ljhhh0123 2011-06-28
  • 打赏
  • 举报
回复
第一个二进制字符0xa1它按有符数解释了。应该这样清晰点
#include <stdio.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer x, unsigned len)
{
unsigned i;
for (i = 0; i < len; i++) {
printf("%.2x ", x[i]);
}
printf("\n");
}

int main(void)
{
int num = 3233;
show_bytes((byte_pointer)&num, sizeof(int));
return 0;
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧