C核心技术手册(二十五)

4.1 算数类型转换

  类型转换通常存在于任意两个算数类型中,当必要时,编译器隐式地执行它们,如果新类型能够表示它,此种转换将保护它的值,这通常也并不绝对,例如,当你将一个负数转换为无符号类型,或将一个浮点数的小数部分由double转换为int时,新类型不能表示原来的值,在这种情况下,编译器会产生一个告警。

4.1.1 类型的层次

  当算术操作数具有不同的类型时,隐式类型转换由类型的层次来决定,类型的层次依据下列规则:

l  任意两个无符号整数类型具有不同的转换等级,如果一个比另一个宽,它将具有较高等级;

l  每一个有符号整数类型具有与相应的无符号整数类型相同的转换等级,charsigned charunsigned char 具有相同的转换等级;

l  标准的整数类型等级排列如下:

_Bool < char < short < int < long < long long

l  任意标准整数类型具有比同样宽度的扩展整数类型较高的等级;

l  每一个枚举类型具有与相应的整数类型相同的等级;

l  浮点类型以下下顺序排列:

  Float < double < long double

l  等级最低的浮点型float的等级高于任何整数类型;

l  每一个复数浮点类型具有与其实数类型和虚数类型相同的等级。

4.1.2整数提升

  在任何表达式中,你通常可以使用一个其类型等级低于int的值来替代int unsigned int类型操作数,你也可以将位域当做整数类型操作数来使用,在这种情况下,编译器使用整数提升,任何类型级别低于int的半自动被转换为int类型,倘若int类型能够表示所有操作数原来的类型;如果int不足以表达,操作数会被转换为unsigned int

  整数提升通常保护操作数的值,一些例子如下:

   Char c = ‘?’;

   Unsigned short var = 100;

   If (c < ‘A’)          //The character constant ‘A’ has type int; the value

                    //of c is implicitly promoted to int for the comparison.

 

   Var = var + 1;      //Before the addition, the value of var is promoted to int

                   // or unsigned int.

在最后这个语句中,在执行加法操作前,编译器将第一个加数的类型提升为intunsigned int,如果intshort具有相同的宽度,就像在16位机器上,这时,带符号的int类型没有足够的宽度来表示unsigned short类型var的所有值,此种场景下,变量的值被提升为unsigned int,在加法执行以后,结果转换为unsigned short

 

你可能感兴趣的:(c,扩展,character,float,编译器)