免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3570 | 回复: 9

[C] c语言unsigned 和 signed转换的问题 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2017-01-09 09:18 |显示全部楼层
  1. #include <stdio.h>
  2. int  main()
  3. {
  4.         char i = 0;
  5.         unsigned char  b = -1;
  6.         while(i < b)
  7.         {
  8.                 printf("%x, %x\n", i, b);
  9.                 i++;
  10.         }
  11.         printf("out...\n");
  12.         return 0;
  13. }
复制代码

b 为 0xff, i的初始值为0x0
我一直以为是可以打印出out...的,但是while循环根本没有出

论坛徽章:
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
发表于 2017-01-09 09:56 |显示全部楼层
i到了0xff,然后又变成0了。想能退出循环,改成 <= 吧

论坛徽章:
0
发表于 2017-01-09 11:23 |显示全部楼层
回复 2# hellioncu

即使改成<=也不会吧。char 的范围是 -128 ~ 127.

论坛徽章:
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
发表于 2017-01-09 12:31 |显示全部楼层
mournjust 发表于 2017-01-09 11:23
回复 2# hellioncu

即使改成

哦,是的。7f之后加一符号扩展变成FFFFFF80了,然后一直到FFFFFFFF,再变成0。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2017-01-09 13:26 |显示全部楼层
回复 3# mournjust

你说的对,但是unsigned 和 signed 比较的时候,不是会转换为 unsigned 吗?

论坛徽章:
0
发表于 2017-01-09 14:14 |显示全部楼层
回复 5# jinxinxin163

因为char跟unsigned char都是比较低等级的类型。
我觉得现在的编译器可能将其转化为signed short 或者 signed int 来比较,这样更加合理。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2017-01-09 19:45 |显示全部楼层
jinxinxin163 发表于 2017-01-09 09:18
b 为 0xff, i的初始值为0x0
我一直以为是可以打印出out...的,但是while循环根本没有出

char与unsigned char并无区别。
仅仅在比较时采用无符号比较方式。
不应该进行有符号与无符号的比较,这是你的错。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2017-01-09 22:56 |显示全部楼层
回复 1# jinxinxin163

由于整形提升(integer promotion), 在 while (i < b) { ... 中,实际检查的相当于是 (int) i < (int) b;那么

0. 由于 i 的实际类型为 signed char(实现相关),(int) i 会进行符号扩展,而 b 的类型为 unsgined char,故 (int) b 为无符号扩展;
1. 在 i 在 0x00 ~ 0x7f 的时候,i < b (0xff) 为真;
2. 在 i 在 0x80 ~ 0xff 的时候,(int) i 的值实际是 0xffffff80 ~ 0xffffffff,都是负数,而 b 的值(0xff)始终为正数,i < b 还是为真。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2017-01-13 10:14 |显示全部楼层
回复 8# MMMIX
谢谢你的回答,你说的很对,实验现象也印证了你的结论!
但是我看网上说 unsigned 和 signed 比较的时候,会转换成unsigned(我用unsigned int和signed int进行比较做过验证)
所以,我得出的结论是:
1. unsigned 和signed 比较的时候,会转换为unsigned ,仅限于int类型
2. 比int小的类型(如char,short)的unsigned和signed的比较,首先会带符号扩展到int,然后进行比较



论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2017-01-13 20:20 |显示全部楼层
回复 9# jinxinxin163

但是我看网上说 unsigned 和 signed 比较的时候,会转换成unsigned(我用unsigned int和signed int进行比较做过验证)


实际情况比这个稍微复杂点。

像这种语言的语法、语义之类的问题,最简单、可靠的途径就是查阅该语言的标准了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP