重读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 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...
随机推荐
- head first--------------------template method pattern
head first---------模板方法模式 浅谈谈模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义 ...
- 使用Cobertura统计JUnit测试覆盖率
这是一个JavaProject,关于Cobertura的用法详见代码注释 首先是应用代码(即被测试的代码) package com.jadyer.service; public class Calcu ...
- 用curl自动登录HTTPS站点
前文http://blog.csdn.net/sheismylife/article/details/9237925 演示了如何手动的通过运行curl命令登录HTTPS站点,然后获取cookie, 再 ...
- java如何避免死锁
在有些情况下死锁是可以避免的.本文将展示三种用于避免死锁的技术: 加锁顺序 加锁时限 死锁检测 加锁顺序 当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生. 如果能确保所有的线程都 ...
- 背水一战 Windows 10 (38) - 控件(布局类): Panel, Canvas, RelativePanel, StackPanel, Grid
[源码下载] 背水一战 Windows 10 (38) - 控件(布局类): Panel, Canvas, RelativePanel, StackPanel, Grid 作者:webabcd 介绍背 ...
- SQL如何获取时间的方法?
getdate():当前系统日期与时间 DATEADD(DAY,5,GETDATE()):当前日期的基础上加上x天 DATEDIFF(DAY,'2017-01-02','2017-01-13'):返回 ...
- RHEL账号总结一:账号的分类
账号是一种用来记录单个用户或者多个用户的数据.RHEL中每一个合法的用户都必须拥有账号,才能使用RHEL. 在RHEL上的账号可以分为两类: 用户账号:用来存储单一用户的数据,你也可以使用一个用户账号 ...
- 获取select选中的值
$("#CalibrationYear option:selected").text();
- servlet笔记
开发servlet有三种方法: (1) 实现 Servlet接口 (2) 通过继承 GenericServlet (3) 通过继承 HttpServlet get提交和post提交的 ...
- 舒适的路线 (code[vs] 1001)
传送门 :code[vs] 1001 思路:拿到这题的首先的思路 , 就是跑一遍最短路. 可是在尝试了一会后发现不会写,于是果断弃 尝试另外的算法.. 于是就有的以下的算法.并查集 + 乱搞(有点像 ...