这里主要介绍ANSI C的特性:当执行算术运算时,操作数的类型如果不同,就会发生转换。数据类型一般朝着精度更高、长度更长的方向转换,整型数如果转换为signed不会丢失信息,就转换为signed,否则转换为unsigned。

一、算术转换(K&R C)

首先:

  • 任何类型为char或short的操作数会被转换为int。
  • 任何类型为float的操作数会被转换成double。

其次:

  • 如果其中一个操作数的类型时double,那么另外一个操作数会被转换成double,计算结果也是double。
  • 如果其中一个操作数的类型时long,那么另外一个操作数会被转换成long,计算结果也是long。
  • 如果其中一个操作数的类型时unsigned,那么另外一个操作数会被转换成unsigned,计算结果也是unsigned。

如果不符合上面几种情况,那么两个操作数的类型都作为int,计算结果也是int。

二、ANSI C的做法

字符和整型(整型升级)

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

寻常算术转换

许多操作数类型为算数类型的双目运算符会引发类型转换,并以类似的方式产生结果类型。它的目的是产生一个普通类型,同时也是运算结果的类型。这个模式称之为寻常算术转换。

具体解释起来较为费篇幅,简单而言(不严谨的说)就是开篇提到的那段话:

当执行算术运算时,操作数的类型如果不同,就会发生转换。数据类型一般朝着精度更高、长度更长的方向转换,整型数如果转换为signed不会丢失信息,就转换为signed,否则转换为unsigned。

一个类型转换bug

往往我们对算术转换都相对敏感,比如float转double之类。而对有符号无符号则相对没那么注意。接下来举个例子,请先看代码,猜猜输出是什么?

#include <iostream>
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
using namespace std;
int array[] = {1,2,3,4,5,6,7,8,9};
int main()
{
int d = -1;
if(d < TOTAL_ELEMENTS)
cout << "-1 小于 TOTAL_ELEMENTS" << endl;
else
cout << "-1 大于 TOTAL_ELEMENTS" << endl;
}

输出是:

TOTAL_ELEMENTS = 9

-1 大于 TOTAL_ELEMENTS

你答对了吗?

结论竟然是:-1<9。这是因为if在signed int和unsigned之间测试相等性,d被升级为unsigned int类型,-1被转换成unsigned int将是一个非常大的数!!!

See you next time. Happy Coding!!!

我的github

最新文章

  1. 构建通用的 React 和 Node 应用
  2. QT QML目录导航列表视图
  3. Android 通过广播获取网络状态
  4. Javascript DOM基础(一)概念
  5. jQuery DataTables 行获取
  6. ios反射
  7. google chrome 32 升级变更找回user agent(google chrome lose user agent)
  8. Redis学习资料汇总(荐)
  9. bzoj3339 bzoj3585
  10. Redis 实践笔记
  11. week4_motion_of_ball_1(小球运动)——最基本
  12. MATLAB——scatter的简单应用
  13. glib实践篇:接口定义与实现
  14. 10.javaweb核心标签库详解
  15. ABP入门系列(21)——切换MySQL数据库
  16. mysql 冷热备份
  17. HTML DOM 事件对象
  18. python列表list
  19. HDU 6106 Classes
  20. linux 杂

热门文章

  1. http访问方式
  2. 通过绑定ip地址可以暂时解决抢占ip问题
  3. GCD总结(一)
  4. 第五周 Leetcode 99. Recover Binary Search Tree (HARD)
  5. bzoj 1666: [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏【模拟】
  6. [Swift通天遁地]一、超级工具-(15)使用SCLAlertView制作强大的Alert警告窗口和Input编辑窗口
  7. sqlalchemy配置多读写库多连接后的关系设置
  8. python orm / 表与model相互转换
  9. selenium-server 启动命令
  10. Kerberos 简介——教你做个好人