首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-26 
C/C++中有符号数和无符号数进行比较时是怎么样转换处理的?印象中是将两边统一作为无符号数进行比较,但

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

热点排行