Chinaunix

标题: c语言unsigned 和 signed转换的问题 [打印本页]

作者: jinxinxin163    时间: 2017-01-09 09:18
标题: c语言unsigned 和 signed转换的问题
  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循环根本没有出


作者: hellioncu    时间: 2017-01-09 09:56
i到了0xff,然后又变成0了。想能退出循环,改成 <= 吧
作者: mournjust    时间: 2017-01-09 11:23
回复 2# hellioncu

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

作者: hellioncu    时间: 2017-01-09 12:31
mournjust 发表于 2017-01-09 11:23
回复 2# hellioncu

即使改成

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

作者: jinxinxin163    时间: 2017-01-09 13:26
回复 3# mournjust

你说的对,但是unsigned 和 signed 比较的时候,不是会转换为 unsigned 吗?
作者: mournjust    时间: 2017-01-09 14:14
回复 5# jinxinxin163

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

作者: yulihua49    时间: 2017-01-09 19:45
jinxinxin163 发表于 2017-01-09 09:18
b 为 0xff, i的初始值为0x0
我一直以为是可以打印出out...的,但是while循环根本没有出

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

作者: MMMIX    时间: 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 还是为真。


作者: jinxinxin163    时间: 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,然后进行比较




作者: MMMIX    时间: 2017-01-13 20:20
回复 9# jinxinxin163

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


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

像这种语言的语法、语义之类的问题,最简单、可靠的途径就是查阅该语言的标准了。





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2