一道类型转换题(from:byr)

include <stdio.h>
 
int A[]={1,2,3,4,5,6,7};
 
#define Length sizeof(A)/sizeof(A[0])
 
int main()
{

int d=-1;
printf("%d/n",d<(sizeof(A)/sizeof(A[0])-2));
 
}

为什么输出0?

解释:

-1<7-2
左边-1为int,右边为size_t,即unsigned
类型提升是这样的:int-->unsigned->long int->unsigned long int
所以将-1的二进制码0xffffffff解释成了很大的unsigned int整数,自然会大于5而导致比较结果为false

 

类型转换规则:

1. 如果其中一个操作数为long double类型,则另一个操作数被转换为long double.
2. 否则,如果其中一个操作数为double, 则另一个操作数被转换为double.
3. 否则,如果其中一个操作数为float, 则另一个操作数也转换为float.
4. 否则,两个操作数进行 "整型升级":
    a. 如果其中一个操作数为unsigned long int, 则另一个操作数也被视为unsigned long int.
    b. 否则,如果其中一个操作数为long int,而另一个操作数类型是unsigned int, 并且long int能够表示unsigned int的所有值,则另一个操作数也被视为long int;如果long int不能表示unsigned int的所有值,则两个数都被视为unsigned long int.
    c. 否则, 如果其中一个操作数是long int,则另一个操作数也被视为long int.
    d. 否则, 如果其中一个操作数是unsigned int, 则另一个操作数也被视为unsigned int.
    e. 否则, 两个操作数都被视为int.

你可能感兴趣的:(一道类型转换题(from:byr))