博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重读The C programming Lanuage 笔记一:类型转换
阅读量:5068 次
发布时间:2019-06-12

本文共 2180 字,大约阅读时间需要 7 分钟。

首先说自动类型转换: 

 当一个运算符的几个操作数类型不同时,就需要吧他们转换位某种共同的类型。一般来说,自动转换把“较低”的类型转换为”较高“的类型。运算结果为较高的类型

以下是不严格的规则:

  首先,如果任何一个操作数为long double类型,则将另外一个操作数转换为long double类型;

  否则,如果任何一个操作数为double类型,则将另外一个操作数转换为double类型;

  否则,如果任何一个操作数为float类型,则将另外一个操作数转换为float类型;

  否则,对两个操作数进行整型提升;然后,如果任何一个操作数为unsigned long int类型,则将另外一个操作数转换为unsigned long int类型;

  否则,如果任何一个操作数为long int类型,而另外一个操作数为unsigned int类型;则结果依赖于long int类型是否可以表示所有的unsigned int类型的值。如果可以,则将unsigned int类型转换为long int;如果不可以,则将两个操作数转换为unsigned long int类型;

  否则,如果任何一个操作数为long int类型,则将另外一个操作数转换为long int类型;  

  否则,如果任何一个操作数为unsigned int类型,则将另外一个操作数转换为unsigned int类型;

  否则,将两个操作数都转换成int类型。

    (以上内容摘自书中,典型的 if...else if ......else 有没有很清晰的感觉?哈哈)

 下面是个例子

1 int main() 2 {     3     if (-1 < (unsigned int)1) { 4         printf("-1 is less than (unsigned int)1\n"); 5  6     } 7  8     else { 9         printf("-1 NOT less than (unsigned int)1\n");10             }11        return 0;12 }13     14

输出结果会是什么?答案是 -1 NOT less than (unsigned int)1

为什么? 看上述规则

  此时将-1转换成unsigned int类型 即为 4G-1 >1;

那么再来看一个例子:

1 int main() 2 {     3     if (-1 < (unsigned char)1) { 4         printf("-1 is less than (unsigned char)1\n"); 5         } 6     else {        7         printf("-1 NOT less than (unsigned char)1\n"); 8     } 9 10     return 0;11 }

结果是:-1 is less than (unsigned char)1

又是为什么?难道不是转换为unsigned char值为255了吗?

还是看规则:否则,对两个操作数进行整型提升。

首先看什么是整型提升。书中原话(当然,是中文版。。)

  如果原始类型的所有值都能用int类型表示,则其值将被转换为int类型,否则转换为unsigned int类型。这一过程称为整型提升。

所以此时-1和unsigned char都转换为int类型,即为 -1 < 1.

不过书中还说:当把一个char类型转换为int类型值时,对不同机器,其结果不同。在某些机器中,如果char值的最左一位是1,中文转换为负数。而在另一些机器中则在char类型值的左边添加0,即为正值。     

  所以说呢,第二个例子的结果取决于集体的实现。不过我试了一下,使用不同机器的结果是相同的。。(包括linux系统)

 

接下来是强制类型转换

  在任何表达式中都可以使用一个称为强制类型转换的一元运算符强制进行显示类型转换。

直接看个简单例子:

<math.h>中的sqrt函数,其参数是double类型。

1 #include 
2 3 int main (){4 int N;5 6 int a = sqrt((double) N);7 }

上述代码中使用了两次强制类型转换:第一次(double)N,将N从int转换为double型此时如果写为sqrt(N)是不正确的,因为其参数是double型

  第二次将a从double型转换为int型。还要说明的是强制类型转换只是生成了指定类型的值,而N的值本身并没有改变。即

double x;

int N;

x = (double)N;

强制转换后N仍是int类型,只是生成了与N具有相同值的double类型的x。

在最初的两个例子,是之前看到一篇博文中的,本想附上链接,但是找不到了,抱歉。

以上,如有不正确的地方恳请纠正,并原谅我的无知与卖弄。

 

转载于:https://www.cnblogs.com/Yiaos/p/5321211.html

你可能感兴趣的文章
scratch少儿编程第一季——06、人在江湖混,没有背景怎么行。
查看>>
C# Async与Await的使用
查看>>
Mysql性能调优
查看>>
iOS基础-UIKit框架-多控制器管理-实例:qq界面框架
查看>>
自定义tabbar(纯代码)
查看>>
小程序底部导航栏
查看>>
poj1611 简单并查集
查看>>
Ubuntu 14.04下安装CUDA8.0
查看>>
跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
查看>>
C# BS消息推送 SignalR介绍(一)
查看>>
WPF星空效果
查看>>
WPF Layout 系统概述——Arrange
查看>>
PIGOSS
查看>>
几款Http小服务器
查看>>
openSuse beginner
查看>>
Codeforces 620E(线段树+dfs序+状态压缩)
查看>>
css3动画属性
查看>>
Mongodb 基本命令
查看>>
控制文件的备份与恢复
查看>>
软件目录结构规范
查看>>