读书人

C/C++中有符号数和无符号数进行==比较

发布时间: 2012-03-26 15:46:56 作者: rapoo

C/C++中有符号数和无符号数进行==比较时是怎么样转换处理的?
印象中是将==两边统一作为无符号数进行比较,但是今天遇到一个问题,自己写代码测了一下,更不明白了:(

以下代码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.将编译器的警告级别设为最高.
2.让编译器把 "警告当作错误来看 ".
[解决办法]
所有运算至少自动升级到int才开始计算。
[解决办法]
对,小于int的到int,int之后都是signed -> unsigned

读书人网 >C++

热点推荐