免费注册 查看新帖 |

Chinaunix

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

unsigned char* 和 char * , [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-09 16:10 |只看该作者 |倒序浏览
请教一下大家,下面这段代码的两次打印输出为什么不一样呢

  1. #include <stdio.h>
  2. int show_bytes( char *start, int len )
  3. {
  4.          int i;
  5.         for (i = 0; i < len; i++)
  6.                 printf(" %.2x", start[i]);
  7.         printf("\n");
  8. }

  9. int show_bytes_1( unsigned  char *start, int len )
  10. {
  11.          int i;
  12.         for (i = 0; i < len; i++)
  13.                 printf(" %.2x", start[i]);
  14.         printf("\n");
  15. }


  16. int main()
  17. {
  18.         short int x = -12345;
  19.        
  20.         show_bytes( &x, sizeof( short int ) );
  21.         show_bytes_1( &x, sizeof( short int ) );
  22.        
  23. }
复制代码

其输出为:
ffffffc7 ffffffcf
c7 cf
为什么第一次输出会是十六个字节呢?如果是在调用printf时进行类型提升,那为什么第二次打印时show_bytes_1没有进行相同的操作呢?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2009-04-09 16:27 |只看该作者
第二次打印时show_bytes_1其实也是类型提升了,只是输出2个够了

论坛徽章:
0
3 [报告]
发表于 2009-04-09 17:22 |只看该作者

回复 #2 hellioncu 的帖子

在show_byte中调用的printf,其所进行的类型提升是 char 提升到 int;
在show_byte_1中调用的printf,其所进行的类型提升是unsigned char 提升到unsigned int;
是这样的吗?多谢了

论坛徽章:
0
4 [报告]
发表于 2009-04-09 22:59 |只看该作者
原帖由 cu_liang 于 2009-4-9 17:22 发表
在show_byte中调用的printf,其所进行的类型提升是 char 提升到 int;
在show_byte_1中调用的printf,其所进行的类型提升是unsigned char 提升到unsigned int;
是这样的吗?多谢了

如果int的范围足够表示所有的unsigned char,那么会提升到int而不是unsigned int。你什么环境啊,根据标准这个好像不太对吧

论坛徽章:
0
5 [报告]
发表于 2009-04-09 23:13 |只看该作者
原帖由 delimy 于 2009-4-9 22:59 发表

如果int的范围足够表示所有的unsigned char,那么会提升到int而不是unsigned int。你什么环境啊,根据标准这个好像不太对吧

Sorry, 刚才晕了。。。
因为你用的是%X啊,这个是给unsigned int准备的。提升为int是肯定的,但是负数提升有符号扩展的。你这个short的两个字节当作signed char刚好是负数,而你的char刚好是signed char。所以误会产生了。。。两个负数字节提升为负整数,但是%X是当作unsigned int来处理的,因为你是32位补码有符号整数,就成那样子的料。。。
不知我说明白没有。。。

论坛徽章:
0
6 [报告]
发表于 2009-04-09 23:30 |只看该作者
printf(" %.2x", start);
这代码谁写的?故意的?

论坛徽章:
0
7 [报告]
发表于 2009-04-09 23:33 |只看该作者

回复 #4 delimy 的帖子

char 带符号扩展,这里符号位正好为1
unsigned char 无符号扩展

论坛徽章:
0
8 [报告]
发表于 2009-04-09 23:33 |只看该作者
原帖由 prolj 于 2009-4-9 23:30 发表
printf(" %.2x", start);
这代码谁写的?故意的?

有何不妥?再说是
  1. start[i]
复制代码
不是 start

[ 本帖最后由 delimy 于 2009-4-9 23:46 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-04-09 23:44 |只看该作者
原帖由 llxxtnt 于 2009-4-9 23:33 发表
char 带符号扩展,这里符号位正好为1
unsigned char 无符号扩展

首先,char可能是signed也可能是unsigned;其次,负数既可以是补码也可以是反码。只有char是有符号并且负数用补码才会有此问题。

论坛徽章:
0
10 [报告]
发表于 2009-04-09 23:52 |只看该作者

回复 #9 delimy 的帖子

无语。。。
你搞纯理论的啊~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP