重读The C programming Lanuage 笔记一:类型转换
首先说自动类型转换:
当一个运算符的几个操作数类型不同时,就需要吧他们转换位某种共同的类型。一般来说,自动转换把“较低”的类型转换为”较高“的类型。运算结果为较高的类型
以下是不严格的规则:
首先,如果任何一个操作数为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 有没有很清晰的感觉?哈哈)
下面是个例子
int main()
{
if (- < (unsigned int)) {
printf("-1 is less than (unsigned int)1\n"); } else {
printf("-1 NOT less than (unsigned int)1\n");
}
return ;
}
输出结果会是什么?答案是 -1 NOT less than (unsigned int)1
为什么? 看上述规则
此时将-1转换成unsigned int类型 即为 4G-1 >1;
那么再来看一个例子:
int main()
{
if (- < (unsigned char)) {
printf("-1 is less than (unsigned char)1\n");
}
else {
printf("-1 NOT less than (unsigned char)1\n");
} return ;
}
结果是:-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类型。
#include <math.h> int main (){
int N; int a = sqrt((double) N);
}
上述代码中使用了两次强制类型转换:第一次(double)N,将N从int转换为double型此时如果写为sqrt(N)是不正确的,因为其参数是double型
第二次将a从double型转换为int型。还要说明的是强制类型转换只是生成了指定类型的值,而N的值本身并没有改变。即
double x;
int N;
x = (double)N;
强制转换后N仍是int类型,只是生成了与N具有相同值的double类型的x。
在最初的两个例子,是之前看到一篇博文中的,本想附上链接,但是找不到了,抱歉。
以上,如有不正确的地方恳请纠正,并原谅我的无知与卖弄。
重读The C programming Lanuage 笔记一:类型转换的更多相关文章
- 重读The C programming Lanuage 笔记四:c预处理
C预处理器执行宏替换.条件编译以及包含指定的文件.以#开头的命令行就是与处理器的对象.这些命令行的语法独立于语言的其他部分,它们可以出现在任何地方,其作用可延续到所在编译单元的末尾(与作用域无关).行 ...
- 重读The C programming Lanuage 笔记二:运算符优先级
运算符的优先级和结合性有明确的规定,但是,除少数例外情况外,表达式的求值次序没有定义,甚至某些有副作用的子表达式也没有定义. 也就是说运算符的定义保证了其操作数按某一特定的顺序求值,否则具体实现可以自 ...
- 重读The C programming Lanuage 笔记三:简单计算器程序
//简单计算器 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <str ...
- 不忘初心 --- 重读<<The C Programming Language>>
这篇文章应该发布在好几年前,2011年计算机界大师Dennis Ritchie仙逝,那时对大师的映象还停留在大一刚学编程时:Unix的合作开发者,C语言的发明人.通过网上的纪念文章<<Un ...
- The Art of Multiprocessor Programming读书笔记 (更新至第3章)
这份笔记是我2013年下半年以来读“The Art of Multiprocessor Programming”这本书的读书笔记.目前有关共享内存并发同步相关的书籍并不多,但是学术文献却不少,跨越的时 ...
- 吴恩达《深度学习》-第一门课 (Neural Networks and Deep Learning)-第二周:(Basics of Neural Network programming)-课程笔记
第二周:神经网络的编程基础 (Basics of Neural Network programming) 2.1.二分类(Binary Classification) 二分类问题的目标就是习得一个分类 ...
- The art of multipropcessor programming 读书笔记-硬件基础1
本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...
- The art of multipropcessor programming 读书笔记-硬件基础2
本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...
- The art of multipropcessor programming 读书笔记-3. 自旋锁与争用(2)
本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...
随机推荐
- android 组件内部实现触摸事件,更改背景
当我们需要实现触摸事件的时候,通常就会想到OnTouchEvent这个方法,它能够获取触摸点的坐标,而组件同样也有这样的一个功能,使用这个功能,可以实现组件在父布局界面上移动,缩放,更改背景图片.这里 ...
- Android---控制设备照相机
本文译自:http://developer.android.com/training/camera/cameradirect.html 本文中,我们讨论如何使用框架API来直接的控制照相机硬件. 直接 ...
- Data Guard组件等相关介绍
1.Data Guard组件介绍 Data Guard架构归类为3个主要的组件. Data Guard 重做传输服务 重做传输服务用来将主数据库生成的重做数据传输给备用数据库. Data Guar ...
- flexbox备忘
伸缩项目的父元素: display:flex || display:inline-flex fiex-direction: row(默认) | row-reverse | column | colum ...
- 清楚float浮动的四种方法
1.对父级设置适合CSS高度 对父级设置适合高度样式清除浮动,这里对“.divcss5”设置一定高度即可,一般设置高度需要能确定内容高度才能设置. 2.clear:both清除浮动 为了统一样式,我们 ...
- c#计算datatable中某一列值的和
double sumPercentage = dt.AsEnumerable().Where(dr => { return dt.Rows.IndexOf(dr) > 0; }).Sum( ...
- tuple 可更改的列表和不可更改的元组
tuple([iterable]) Return a tuple whose items are the same and in the same order as iterable's items. ...
- Storm 1.0.0
Storm 1.0.0版本增加了很多新的特性,可用性以及性能也得到了很大的改善,该版本是Storm发展历程上一个里程碑式的版本,主要特点如下. 性能提升 Storm 1.0.0版本最大的亮点就是性能提 ...
- cuda编程(一)
环境安装和例程运行 显卡主要有两家,ATI.NVIDIA,简称A卡和N卡.随着GPU计算能力的上升,采用GPU并行计算来加速的应用越来越多. Nvidia创立人之一,黄仁勋(Jen-Hsun Huan ...
- Everything(速度快的文件搜索软件) 1.4.1.801b 汉化绿色版
软件名称: Everything(速度快的文件搜索软件) 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win7 / Vista / Win2003 / WinXP 软件大小: 2.0MB ...