重读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 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...
随机推荐
- 图的匹配问题与最大流问题(三)——最大流问题Ford-Fulkerson方法Java实现
上篇文章主要介绍了Ford-Fulkerson方法的理论基础,本篇给出一种Java的实现. 先借助伪代码熟悉下流程 FORD-FULKERSON(G,t,s) 1 for each edge(u,v) ...
- icon 图标下载
1. http://www.easyicon.net/ 2.http://www.iconpng.com/
- CSUOJ 1299 - Number Transformation II 打表预处理水DP
http://122.207.68.93/OnlineJudge/problem.php?id=1299 第二个样例解释.. 3 6 3->4->6..两步.. 由此可以BFS也可以DP. ...
- 导入导出csv文件
在工作中需要把csv文件数据导入数据库或者把数据库数据导出为csv文件.以下是我的简单的实现. <?php class csv { public $db_connection; public $ ...
- 将int,bigint整型数值可逆转换字符串
将 Int 和 BigInt 类型数值转换为字符串的可逆方法,可用于缩短网址或记录的ID转换等. 如: 9223372036854775807 => aZl8N0y58M7 class Conv ...
- dev gridcontrol 绑定int型及日期型的列默认当值为0时显示空白及格式化日期显示方式
xmlns:sys="clr-namespace:System;assembly=mscorlib" 如只显示日期的时间部分 <dxg:GridColumn Header=& ...
- jsp页面根据当前时间和定义时间差计算动态倒计时
jsp页面根据当前时间和定义时间差计算动态倒计时http://www.jb51.net/article/74140.htm var maxtime =1000*60; //半个小时,按秒计算,自 ...
- ios在项目中打开word文档、ppt等总结
最近在项目开发中遇到下载附件文档预览需求,在这里总结一下我的实现方法,本文最后会附带我写的demo下载地址 这里我总结了三种实现方法(1)用webView预览(2)通过UIDocumentIntera ...
- html css jquery 回到顶部按钮
今天做了个回到顶部的功能,在这里记录一下,有需要可以拿去试试! CSS部分,很简单就一个class /*回到顶部*/ .back-top { position: fixed; right: 15px; ...
- HTML,CSS,JS,JQ
CSS: <style> <!--属性选择器--> .container input[type="text"][name="txt"]{ ...