数据升级 int 和 unsigned int

运行下面代码:
#include <stdio.h>
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
int array[] = 32,33,11,42,43,21 };

int main()
{
    
int d = -1;

    
if ( d <= TOTAL_ELEMENTS - 2 )
        printf(
"d is less than TOTAL_ELEMENTS-2)  ;
    else
        printf(
"d is NOT than TOTAL_ELEMENTS-2)  ;
       
    
return 0;
}

看看运行结果输出是什么?

原因:
        C中的整数升级: char, short int 或者int型位段,包括他们的有符号和无符号变型,以及枚举类型,可以使用在需要int 或 unsigned int 的表达式中。如果int能完整表示源类型的所有值,那么该源类型的值就被转换成int,否则转换成unsighed int。

        sizeof()返回的是unsigned int, 当 d 与 TOTAL_ELEMENTS - 2 比较时会升级为unsigned int,  因为d是-1就被转成了一个非常大的正数

         需将 if ( d <= TOTAL_ELEMENTS - 2 ) 改成 if ( d <= (int)TOTAL_ELEMENTS - 2 )

建议: 在代码中尽量少使用无符号类型,特别不要因为有些年龄,人口等无负数的值,而使用无符号类型。
posted on 2005-08-31 21:24  我在等待  阅读(413)  评论(0)    收藏  举报