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

翻译 2011年01月16日 15:52:00

4.1.3常用算术转换

  常用的算术类型转换为隐式转换,常用算术类型转换目标是为所有的操作数即操作结果寻找一个通用的类型。

常用的算术类型转换涉及以下操作数:

l  具有两个操作数的算术操作符: *, /, %, +-

l  关系操作符: <, <=, >, >=, ==!=

l  位操作符:&, |^

l  条件操作符:?:

除关系操作符外,常用算术转换获得的公共实数类型通常为结果值的类型,然而,如果一个或多个操作数为复数类型,刚结果也具有复数类型。

 

常用算术转换的应用如下:

1.         如果任一个操作数为复数,此时,具有低转换等级的操作数转换为具有与其他操作数相同的类型,实数和虚数部分各自进行转换;

换句话说,如果一个操作数具有复数类型,通常算术转换仅匹配实数部分,下面是一些例子:

    #include <complex.h>

    // ...

    short n = -10;

    double x = 0.5, y = 0.0;

    float _Complex f_z = 2.0F + 3.0F * I;

    double _Complex d_z = 0.0;

 

    y  = n * x;           // The value of n is converted to type double.

    d_z = f_z + x;        // Only the value of f_z is converted to

                          // double _Complex.

                          // The result of the operation also has type

                          // double _Complex.

 

    f_z = f_z / 3;        // The constant value 3 is converted to float.

    d_z = d_z - f_z;      // The value of f_z is converted to the type

                          // double _Complex.

 

2.         如果两个操作数为整数,则先对两个操作数进行整型提升,在此之后,如果类型还不相同,这时,会以以下规则进行转换:

a)         如果一个操作数具有unsigned 类型T,且它的转换级别等于或高于其他操作数的类型,那么其它操作数将转换为类型T

b)         否则,如果一个操作数具有signed类型T, 且其转换级别高于其它操作数类型,如果类型T足够大能够之前的所有类型值;如果不是,则两个操作数转换为类型T对应的无符号类型。

下面是一些例子:

  Int I = -1;

  Unsigned int limit = 200U;

  Long n = 30L;

  If ( I < limit)

   X = limit * n;

在此例中,if条件中为比较语句, i的值为-1, 首先会转换为unsigned int,结果是一个很大的正数,在32位系统上,其值为232 – 1, 且在任何系统上,其值都大于limit,所以if条件为false.

例子中的最后一行,如果long的取值范围能够包含unsigned int的所有取值,则limit的值转换为变量n的类型long,如果不是,例如,intlong均为32位的宽度,则它们的类型将转换为unsigned long

 

除了以一情景外,常用算术转换会保护操作数的值:

l  当一个巨大的整数转换为浮点类型时,目标类型的精度可能不足以精确地表示此数;

l  超出无符号类型取值范围的负数;

在这两种情景中,数值超过了目标类型的范围或精度,这种转换将在接下来的一节算术类型转换的结果中讲述。

4.1.4 其他的隐式类型转换

在下列场景下,编译器也会自动转换算术值:

l  在分配或初始化,右操作数的值通常会转换为左操作数的类型;

l  在函数调用中,实参将转换为相应的形参类型,如果参数没有被声明,则会进行默认的参数提升,整型参数进行整型提升,float参数提升为double;

l  return语句中,return表达式的值将转换为函数返回值的类型。

在一个复数的赋值语句中,例如x += 2.5, 两个操作数的值首先进行算术转换,所以运算的结果类型就为左操作数的类型,下面是一些例子:

    #include <math.h>       // Declares the function double sqrt( double ).

 

    int   i = 7;

    float x = 0.5;    // The constant value is converted from double to float.

 

    i = x;           // The value of x is converted from float to int.

 

    x += 2.5;        // Before the addition, the value of x is converted to

                   // double. Afterward, the sum is converted to float for

                   // assignment to x.

 

    x = sqrt( i );      // Calculate the square root of i:

                   // The argument is converted from int to double; the return

                   // value is converted from double to float for assignment to x.

 

    long my_func( )

    {

      /* ... */

      return 0;      // The constant 0 is converted to long, the function's return

                   // type.

    }

linux c函数库参考手册

Linux C函数库参考手册 第1章字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ASCII码字符) ...
  • a1009563517
  • a1009563517
  • 2015年10月30日 14:04
  • 1254

6.1、指针的概念

为了说清楚什么是指针,必须弄清楚数据在内存中是如何存储的,又是如何读取的。 如果在程序中定义了一个变量,在编译时就给这个变量分配内存单元。系统根据程序中定义的变量类型,分配一定长度的空间。例如,...
  • dapinxiaohuo
  • dapinxiaohuo
  • 2015年03月09日 15:13
  • 237

人工智能的五大核心技术

计算机视觉、机器学习、自然语言处理、机器人和语音识别是人工智能的五大核心技术,它们均会成为独立的子产业。   计算机视觉     计算机视觉是指计算机从图像中识别出物体、...
  • sergeycao
  • sergeycao
  • 2017年07月17日 16:40
  • 407

Java核心技术--开篇

从毕业到现在一年多了,工作也换了两家,第一家是一个央企,进去差不多半年时间,干的就是一些琐碎的事情,开发任务也基本没有(改改官网,申请公众号),到后来给我一个人给了一个内控项目(也就是一个内部办公系统...
  • ILV_XJ
  • ILV_XJ
  • 2017年11月06日 10:43
  • 105

MySQL C API(5.1参考手册)

C API代码是与MySQL一起提供的。它包含在mysqlclient库中,并允许C程序访问数据库。 MySQL源码分发版的很多客户端是用C语言编写的。如果你正在寻找能演示如何使用C API的示例,可...
  • qq920020796
  • qq920020796
  • 2015年10月19日 15:10
  • 2324

软件开发的核心技术

《编程导论(Java)·0.1.5 问题求解》 程序员采用编程语言编写源代码的活动——编程常常概括成问题求解(problem solving)。 待解决的问题可大可小,而问题的解决方案正好需要计算机...
  • yqj2065
  • yqj2065
  • 2015年07月09日 16:39
  • 3222

iOS开发核心技术(一)——多线程——简介

第三方
  • u014624688
  • u014624688
  • 2014年04月21日 22:21
  • 835

《这就是搜索引擎:核心技术详解》读书笔记

学Java的时候也顺便看了一下网上的一个爬虫的源码,感觉看完了收获也很有限,只是大概了解了一下其基本思路:从用户添加的种子URL作为起点,不断请求web页面,然后从页面中提取出新的URL,添加到爬取队...
  • hust_dxxxd
  • hust_dxxxd
  • 2016年05月03日 22:12
  • 503

Spring的核心技术(一)

这部分参考文档涵盖了Spring框架中的所有关键技术,其中最重要的是Spring框架的控制反转容器(IoC),然后是与IoC容器紧密结合的Spring的面向切面(AOP)的编程技术。Spring框架有...
  • FireOfStar
  • FireOfStar
  • 2015年11月16日 08:59
  • 2241

《写给大忙人看的Java核心技术》读书笔记

1基本的编程结构 1.2.1 整型的的范围不依赖程序所运行的机器。 1.2.1整型的赋值可以给数字添加下划线,例如1_000_000表示一百万,下划线阅读起来更容易,Java编译器会直接删除它们 ...
  • kaxier5000
  • kaxier5000
  • 2017年03月14日 21:30
  • 655
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C核心技术手册(二十六)
举报原因:
原因补充:

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