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