C语言数值类型转换K&R C与ANSI C的区别

K&R C中关于算术转换的规定:

  1. 任意类型为char或是short的操作数被转换为int;
  2. 任意类型为float的操作数被转换为double;
  3. 如果其中一个操作数为double,那么另一个操作数也被转换为double,计算结果也是double;
  4. 一个操作数是long,那么另一个操作数也被转换为long,结果也是long;
  5. 如果其中一个操作数是unsigned,那么另一操作数也被转换为unsigned,结果也是unsigned;
  6. 如果不符合上述所有情况的任意一种,那么两个操作数都作为int型,计算结果也是int型。

ANSI C关于算术转换的规定:

整型提升:

  1. char,short int或者int型位段,包括他们的有符号无符号变型,以及枚举类型,可以使用在需要int或unsigned int 的表达式中,如果int可以完整表示源类型的所有值,那么就转换为int型,否则转换为unsigned int ,称为整型升级

寻常算术转换:

  1. 其中一个操作数是long double,那么另一个操作数也被转换为long double ;
  2. 如果其中一个操作数为double,那么另一个操作数也被转换为double;
  3. 如果其中一个操作数为float,那么另一个操作数也被转换为float;
  4. 不是上述任一情况则按下述规则进行整型升级:
  • 如果一个操作数是unsigned long int,那么另一个操作数也转换为unsigned long int;
  • 如果一个操作数是long int,而另一个操作数是unsigned int ,如果long int(32bit)能够完整表示unsigned int(16bit) 值,那么unsigned int 类型操作数被转换为long int,如果long int(32bit)不能完整表示unsigned int(32bit)的所有值,那么两个操作数否被转换为unsigned long int;
  • 如果一个操作数是unsigned long int,那么另一个操作数也转换为unsigned long int;
  • 如果一个操作数是unsigned int,那么另一个操作数也转换为unsigned int;
  • 都不属于上述,则转换为int;

浮点操作数与浮点表达式的值可以比类型本身所要求的更大精度和更广范围来表示,而它的类型并不改变。

ANSI C标准所表达的意思:当执行算术运算时,操作数的类型如果不同,就会发生转换。数据类型一般朝着浮点型精度更高,长度更长的方向转换,整型数如果转换为signed不会丢失信息,就会转换为signed,否则转换为unsigned。

K&R C采用无符号保留的原则:当一个无符号类型与int或更小的整型混合使用时,结果类型是无符号类型;

ANSI C标准采用值保留原则:将几个整型操作数像下面这样混合使用时,结果可能是有符号数也可能是无符号数,取决于操作数的类型相对大小。

main()
{
    if(-1 < (unsigned char)1)
    {
        printf("-1 is less than (unsigned char)1:ANSI semantics");
    }
    else
    {
         printf("-1 is NOT less than (unsigned char)1:K&R C semantics");
    }
}

-1的位模式都一样,对于编译器(ANSI C)而言解释为负数,而K&R C解释为无符号数

 

ref:《C专家编程》著[Peter Van Der Linden],徐波译。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章