免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 13781 | 回复: 8
打印 上一主题 下一主题

[C++] 为什么我printf格式化16进制输出,会多出好多个FF [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-08 11:48 |只看该作者 |倒序浏览
为什么我printf格式化16进制输出,会多出好多个FF:

int F::printHex(char *name, char *data, size_t length)
{
    if (name != NULL) {
        printf("%s",name);
    }
   
    for (int i = 0; i < length; i++) {
        printf("%02X ", data[i]);
    }
    printf("\n");
    fflush(stdout);
   
    return 0;
}
结果

FFF00 03 00 01 FFFFFF1A 53 18 00 00 00 FFF33 35 33 35 35 32 30 34 39 30 31 36 32 32 36 00 14 00 00 00 FFFFFFFFFFF

论坛徽章:
0
2 [报告]
发表于 2014-03-08 13:44 |只看该作者
不明觉里的说,看看data是啥内容就知道了。

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
3 [报告]
发表于 2014-03-08 14:25 |只看该作者
很正常呀, 负数 呀.

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2014-03-08 14:41 |只看该作者
正确写法
  1. printf("%02X ", (unsigned char)data[i]);
复制代码

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
5 [报告]
发表于 2014-03-08 14:42 |只看该作者
因为你的编译器的char 是signed char , 你要告诉它这个是unsigned 的, 而不是char的。

论坛徽章:
0
6 [报告]
发表于 2014-03-10 11:10 |只看该作者
转换成 unsigned char 实际上是治标不治本的方法。你需要把 %02X 换成 %02hhX。

与 X 对应的形参是 unsigned int 型的,而加上了长度修饰符 hh 后,对应的形参是 unsigned char 型的。

多余的 FF 是在实参 -> unsigned int 时引入的。提前转换为 unsigned char 只是让这一转换过程不引入多余的 FF,语义上仍旧是「以十六进制输出一个 unsigned int」,是错误的。

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
7 [报告]
发表于 2014-03-11 09:48 |只看该作者
6楼分析的有理啊。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
8 [报告]
发表于 2014-03-11 13:13 |只看该作者
unsigned char转换一下就好了,扩宽填充符号位了。

论坛徽章:
0
9 [报告]
发表于 2014-03-11 15:04 |只看该作者
都是高手啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP