现在的位置: 首页 > 综合 > 正文

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

2013年08月18日 ⁄ 综合 ⁄ 共 767字 ⁄ 字号 评论关闭

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.

抱歉!评论已关闭.