VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1500|回复: 7

C/C++中有符号数和无符号数进行==比较时是怎么样转换处理的?

[复制链接]

1

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2019-12-27 17:33:57 | 显示全部楼层 |阅读模式
印象中是将==两边统一作为无符号数进行比较,但是今天遇到一个问题,自己写代码测了一下,更不明白了:(

以下代码part1部分,是不同长度的有符号数与无符号数的比较,看似是以扩展到相同长度后各自内存的内容直接对比,但是从part2部分来看,结果却又不是这样。

请问究竟如何理解? 多谢!!!!!



#include <iostream>
using namespace std;

int main()
{
  /* part 1*/

  cout << "(bool)((unsigned long)-5(" << hex << (unsigned long)-5 << ")"
       << " == (unsigned short)-5)(" << hex << (unsigned short)-5 << "): "
       << (((unsigned long)-5 == (unsigned short)-5) ? "true" : "false") << endl;

  cout << "(bool)((signed long)-5(" << hex << (signed long)-5 << ")"
       << " == (signed short)-5)(" << hex << (signed short)-5 << "): "
       << (((signed long)-5 == (signed short)-5) ? "true" : "false") << endl;
  
  cout << "(bool)((unsigned long)-5(" << hex << (signed long)-5 << ")"
       << " == (unsigned short)-5)(" << hex << (signed short)-5 << "): "
       << (((unsigned long)-5 == (signed short)-5) ? "true" : "false") << endl;
  
  cout << "(bool)((signed long)-5(" << hex << (unsigned long)-5 << ")"
       << " == (signed short)-5)(" << hex << (unsigned short)-5 << "): "
       << (((signed long)-5 == (unsigned short)-5) ? "true" : "false") << endl;


  /*************************************************************/
  /* part 2 */

  signed short x = -1;
  unsigned short y = 65535;
  cout << "(bool)(x(" << hex << x << ") == y(" << hex << y << ") = "
       << (x == y ? "true" : "false") << endl;
      
  x = 0xffff;
  y = 0xffff;
  cout << "(bool)(x(" << hex << x << ") == y(" << hex << y << ") = "
       << (x == y ? "true" : "false") << endl;

  cin.get();
}

回复

使用道具 举报

1

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2019-12-27 17:34:35 | 显示全部楼层
对了,附上Dev-cpp的运行结果

(bool)((unsigned long)-5(fffffffb) == (unsigned short)-5)(fffb): false
(bool)((signed long)-5(fffffffb) == (signed short)-5)(fffb): true
(bool)((unsigned long)-5(fffffffb) == (unsigned short)-5)(fffb): true
(bool)((signed long)-5(fffffffb) == (signed short)-5)(fffb): false
(bool)(x(ffff) == y(ffff) = false
(bool)(x(ffff) == y(ffff) = false
回复

使用道具 举报

1

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-1-5 12:06:01 | 显示全部楼层
自己顶一下。。。
回复

使用道具 举报

0

主题

8

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-1-7 09:51:01 | 显示全部楼层
象这样的情况,应该是程序员给出明确的处理方法,而不能依赖编译器的行为,要知道有很多编译器,它们的处理可能不敬相同,但是程序员需要的结果却只有一个。
我们可以让编译器帮助我们发现这些容易出错,但是却很难发现的地方:
1.将编译器的警告级别设为最高.
2.让编译器把"警告当作错误来看".
回复

使用道具 举报

0

主题

55

帖子

44.00

积分

新手上路

Rank: 1

积分
44.00
发表于 2020-2-17 00:15:01 | 显示全部楼层
所有运算至少自动升级到int才开始计算。
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-3-1 12:45:01 | 显示全部楼层
对,小于int的到int,int之后都是signed -> unsigned
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-3-25 10:00:01 | 显示全部楼层
12)八皇后问题
在一个8*8的国际象棋盘上,有八个皇后,每个皇后占一格;要求皇后间不会出现相互“攻击”的现象,既不能有两个皇后处在同一行、同一列或同一对角线上。问共有多少种不同的方法。
每个同学选择1—2个题目的编程与调试。
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-6 13:15:01 | 显示全部楼层
[Quote=引用 5 楼 genius_hb 的回复:]
对,小于int的到int,int之后都是signed   ->   unsigned
[/Quote]

学习了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表