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

翻译 2011年01月14日 23:52:00

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核心技术手册(四十四)

GCC 编译 优化
  • dyx1024
  • dyx1024
  • 2011年05月03日 23:45
  • 851

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

字符常量
  • dyx1024
  • dyx1024
  • 2011年01月04日 22:14
  • 893

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

浮点常量可被写为十进制或十六进制
  • dyx1024
  • dyx1024
  • 2011年01月03日 23:53
  • 616

C核心技术手册(三十八)

连接
  • dyx1024
  • dyx1024
  • 2011年04月19日 00:10
  • 897

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

算术类型转换结果(_Bool类型转换 和 无符号整型转换)
  • dyx1024
  • dyx1024
  • 2011年01月17日 00:06
  • 646

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

字符串常量
  • dyx1024
  • dyx1024
  • 2011年01月08日 00:01
  • 2197

C核心技术手册(三十)

显式指针转换(对象指针、函数指针)
  • dyx1024
  • dyx1024
  • 2011年01月23日 18:39
  • 638

C核心技术手册(三十九)

多个源文件的编译
  • dyx1024
  • dyx1024
  • 2011年04月20日 00:11
  • 799

C核心技术手册(三十四)

表达式求值、左值
  • dyx1024
  • dyx1024
  • 2011年02月13日 00:06
  • 787

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

非算术类型转换(数组和函数操作指示符)
  • dyx1024
  • dyx1024
  • 2011年01月21日 23:37
  • 810
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C核心技术手册(二十五)
举报原因:
原因补充:

(最多只允许输入30个字)