LFMY

导航

类型提升

类型提升规则:

1、首先,如果一个操作书的类型是long double,那么另一个操作数也被转化为long double。其次,如果一个操作数的类型是double,那么另一个操作数也被转换为double。再次,如果其中一个操作数的类型是float,那么 另一个操作数也被转换为float。否则,两个操作数进行整型提升,执行下面的规则:

2、如果其中一个操作数是unsigned long int,那么另一个操作数也被转换为unsigned long int。其次,如果其中一个操作数是long int, 而另一个操作数的类型是unsigned int ,如果long int 能够完整表示unsigned int 的所有值,那么unsigned int类型操作数被转换为long int,如果long int类型不能完整的表示unsigned int 的所有值,那么两个操作数都被转换为unsigned long int。再次,如果其中一个操作数的类型是long int,那么另一个操作数转换为long int。再再次,如果其中一个操作数的类型是unsigned int ,那么另一个操作数被转换为unsigned int。如果所有以上的情况都不属于,那么两个操作数都为int。

(注意:unsigned long int可能是32bits,也可能是64bits。)

(3、总结:当执行算术运算时,操作数的类型如果不同,就会发生转换。数据类型一般朝着浮点精度更高、长度更长的方向转换,整型数如果转换为signed不会丢失信息,就转为signed,否则,转换为unsigned。(见《c专家编程》第一章))

int array[]={1, 2, 3};
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))

int main()
{
    int d = -1;
    int x = 0;
    short i = 1;
    
    if(d<=TOTAL_ELEMENTS)//signed int与unsigned int比较:类型提升
      x = 1;

    printf("%d\n", x);
    printf("%d\n", sizeof'a');//类型提升已经“褪色”
    printf("%d %d\n", sizeof('a'-'0'), sizeof(i * i));//见by the way部分的解释
    return 0;
}
类型提升

 另一个例子:

int main()
{
    unsigned short a = 6;
    short b = -20;
   
    int c = a + b;
    //a---->(int)
    //b---->(int)
   
    unsigned short d = a + b;
    //a---->(int)
    //b---->(int)
    //(int)----->(unsigned short)
    int e = d;
    //(unsigned short)---->(int)
   
    printf("%d, %d\n", sizeof(short), sizeof(int));//2,4
    printf("%d, %d\n", c, e);//-14, 65522
   
    return 0;
}
类型提升

 

by the way:

*printf函数的“%d”可以能够处理char、short、int类型的原因,也是因为printf函数从寄存器、内存中取出的数据都是int,除非特别的声明为“%ld”。

*(知根知底)

K&R C中(旧风格)

函数没有原型时:向函数传参数的时候,函数实际接收到的是int、double、指针,函数体内根据具体类型进行裁剪,这样的做法是因为这样就简化了编译器——所有的参数大小都一样。

函数有原型是:缺省的参数提升就不会发生

 ANSI C中(新风格)函数不会有参数提升!!!

 

posted on 2014-03-27 10:17  LFMY  阅读(374)  评论(0)    收藏  举报