免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: cu_liang
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2009-04-10 07:20 |只看该作者
原帖由 delimy 于 2009-4-9 23:44 发表

负数既可以是补码也可以是反码。

原码和移码也可以表示负数。只是,现在已找不到原码机器和反码机器,而移码只用来表示浮点数的阶码部分。带符号整型(包括char、short、int、long等)都是补码的。学理论得联系实际。

论坛徽章:
0
12 [报告]
发表于 2009-04-10 09:17 |只看该作者
原帖由 beepbug 于 2009-4-10 07:20 发表

原码和移码也可以表示负数。只是,现在已找不到原码机器和反码机器,而移码只用来表示浮点数的阶码部分。带符号整型(包括char、short、int、long等)都是补码的。学理论得联系实际。

胡说了吧。看看C标准吧,6.2.6.2节。理论自然要有根据,对不?

论坛徽章:
0
13 [报告]
发表于 2009-04-10 14:03 |只看该作者
纯理论学院派散开

论坛徽章:
0
14 [报告]
发表于 2009-04-10 14:05 |只看该作者
原帖由 delimy 于 2009-4-10 09:17 发表

胡说了吧。看看C标准吧,6.2.6.2节。理论自然要有根据,对不?

我可能是胡说,完全有可能。但是,你不能拿C标准来否定这个,因为关于什么码机器的事,不在C,在更低的地方。

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

看来一下大家的讨论,感觉应该是这样的:
无论是在 show_byte还是show_byte_1中,printf所进行的类型提升都是提升到 int类型。
在show_byte中,从char提升到 int,是对有符号数的提升,一个二进制补码数字的扩展,因此用的是符号扩展,添加的是最高有效位的值。
在show_byte_1中,从 unsigned char 提升到 int, 是对一个无符号数的扩展,前面添加0即可,因此在打印的时候只打印了两位,不需要把前面因扩展而添加的0打印出来。

论坛徽章:
0
16 [报告]
发表于 2009-04-14 22:05 |只看该作者
其输出为:
ffffffc7 ffffffcf
c7 cf
为什么第一次输出会是十六个字节呢?如果是在调用printf时进行类型提升,那为什么第二次打印时show_bytes_1没有进行相同的操作呢?

我来说明一下我的理解:
1、无论是show_bytes还是show_bytes_1,被调用后他们的start都指向内容为CFC7的内存区域,原因是-12345的补码为CFC7(注间是小字节优先);
2、无论是show_bytes还是show_bytes_1,在执行循环时,start[ i ]这个字符变量的两次取值,其位模式都是CF,C7,只不过show_bytes按有符号数处理,show_bytes_1按无符号处理;
3、在show_bytes中,有符号的字符型数据CF,C7分别做为参数传入printf,此时会将类型提升为int,由于是有符号数,所以符号位要进行扩展,得到FFFFFFCF和FFFFFFC7。
4、在show_bytes_1中,无符号的字符型数据CF,C7分别做为参数传入printf,此时会将类型提升为unsigned int,由于无符号数不进行符号位扩展,所以得到000000CF和00000C7。
5、在show_bytes中,printf函数按" %.2x"的格式输出FFFFFFCF和FFFFFFC7,这里请查阅一下prtinf的手册,修饰符x指将参数按unsigned int来输出,所以不管你原来传进来是无符号数或无符号数,这里都当无符号数处理,虽然指定了宽度修饰符,但它只会在截短输出后不影响大小的情况下才起作用,所以输出自然就是FFFFFFCF和FFFFFFC7(把无符号数前面的F去一个的话,这个无符号数的大小就变了),这才是输出FFFFFFCF和FFFFFFC7的本质原因。
6、在show_bytes_1中,printf函数按" %.2x"的格式输出000000CF和00000C7,按照上面的规则,这里还要都当无符号数处理,但此时宽度修饰符起作用了,截短为2位时并不影响大小,所以输出为CF,C7。

论坛徽章:
0
17 [报告]
发表于 2009-04-15 14:07 |只看该作者

回复 #16 jtkk 的帖子

谢谢你的回复,不过对你的理解有几点不同意的地方,希望能继续讨论。

>>1、无论是show_bytes还是show_bytes_1,被调用后他们的start都指向内容为CFC7的内存区域,原因是-12345的补码为CFC7(注间是小字节优先);
你说的小字节优先,是指字节序吧。如果是小字节优先的话,我觉得应该是 “指向内容为C7CF的内存区域”。
》》4、在show_bytes_1中,无符号的字符型数据CF,C7分别做为参数传入printf,此时会将类型提升为unsigned int,由于无符号数不进行符号位扩展,所以得到000000CF和00000C7。
这里你说的类型提升为unsigned int,其依据是什么呢?提升为int 类型不已经足够表示其真正大小了吗?

》》虽然指定了宽度修饰符,但它只会在截短输出后不影响大小的情况下才起作用,
%.2x,指定的应该是printf的精度,而不是宽度吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP