重读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 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...
随机推荐
- 如何Windows系统中搭建php环境
PHP介绍: PHP 独特的语法混合了C.Java.Perl以及PHP自创的语法.它可以比CGI或者Perl更快速地执行动态网页.用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTM ...
- ajax实现分页
使用ajax分页原理:第一步:做一个表格 第二步:封装两个方法.第三步:新建个负责显示页面.第四步:做一个纯PHP处理页面处理要显示页的所有数据 首先使用一张数据比较多的数据库中的表格: 首页面加载后 ...
- 文件上传<springmvc>
使用commons-fileupload-1.3.1.jar和commons-io-2.4.jar web.xml <?xml version="1.0" encoding= ...
- C#开发学习——web服务器端控件
Asp.net在客户端开发和web开发所用到的控件还是有很大的差别的,而且Web开发的界面是在浏览器中显示的,所以控件的设计都和前边学习HTML设计有联系,没有客户端开发那么简单,不过我们可以 ...
- Docker集群实验环境布署--swarm【7 让docker客户端支持docker-compose】
Docker-Compose是一个部署多个容器的简单但是非常必要的工具. 登录Docker客户端的服务器(默认是安装了docker-engine的服务器),再安装compose插件 # yum i ...
- java后台接受app上传的图片
package com.sujinabo.file; import java.io.File; import java.io.FileOutputStream; import java.io.IOEx ...
- Sipdroid实现SIP(四): 传输层和应用层之间的枢纽SipProvider
目录 一. 概述 二. 主要变量 三. 主要方法 四. 在Sipdroid中的应用 一. 概述 在整套Sipdroid源码中, 类SipProvider是最靠近TCP/UDP的一层, 在Sipdroi ...
- 开子线程下载图片,回到主线程刷新UI步骤
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [NSThread detachN ...
- vedio_note2
例化 for example ex_cnt ex_cnt_inst( //模块名 例化的名字 .clk(ckl_o), // . 后面是原模块的名字 括号里面是top里的名字 .rst_n(rst_n ...
- idea不能加载xml