C语言细节——献给入门者(三)
>>主题:关于强制类型转换
先来瞎扯下强制类型转换,c语言有很多数据类型,long,short,int,float,double,bool,char等等。当我们要将一种数据类型赋值给另一种数据类型,或者将某个操作数进行如此的转化的时候,就用到了强制类型转换。
强制类型转换分成两种:1.显示强制类型转换(主动) 2.隐式强制类型转换(被动/自动)
要区分这两者很简单,看下面例子:(we assume that b is a variable of integer.)
char a = (char)b; char a = b;
所以区分两者只要看这个(char)是否显式的写出来。但我们要注意,这两个的区别绝对不是这么简单。让我们看下去...
》》》如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。
这段和这图是我百度来的,他说计算机会主动把float,int分别转换成double,long计算,后来想来一下发现跟计算机组成学的不一样,况且如果都这样计算,那还需要小数据类型干嘛呢?计算机速度何必非得用双精度来测量?后来我自己测了一下,发现果然是瞎扯,我就不用这个图说啦~(附上测试代码)
(ps:以下按照int为32位来说明):
测试代码:
#include <stdio.h>
int main()
{
int a=,b=;
int c=a+b;
long aa=,cc=;
long bb=aa+cc; printf("%d\n",c );
printf("%ld\n",bb );
return ;
}
反汇编后所得(部分代码):
movl $, -(%rbp)
movl $, -(%rbp)
movl $, -(%rbp)
movl -(%rbp), %eax
addl -(%rbp), %eax
movl %eax, -(%rbp)
movq $, -(%rbp)
movq $, -(%rbp)
movq -(%rbp), %rcx
addq -(%rbp), %rcx
movq %rcx, -(%rbp)
movl -(%rbp), %esi
movb $, %al
感觉一下子打乱我思路了,让我捋一捋。。。
》》》先看下两个优先级的例子,很多人可能没有注意到:
num = (double)k/m;
在这里,无论double是强制类型转换了k还是k/m,答案都一样;但这边的double是修饰k的,因为括号的优先级是高于/的;
如果想要double修饰k/m的话就可以这样做:
num = (double)(k/m);
另一个例子:
a = (int)father->age;
这里很明显int是修饰age的,因为father是不能强制类型转换成int类型的;这里是因为->的优先级高于括号;
》》》接下来看看有关数据类型的几种例子
case 1:
int a,b=;
a=(int)b;
这里 因为a,b都是int型,所以这边的(int)可以不用,即显式隐式都是可以的;
case 2:
int a;
char b='A';
a=(int)b;
char a;
int b=;
a=(char)b;
首先这个例子能互换是因为字符和整型之间可以通过ascii码转换,其次char占一个字节而int占4个字节;
在前一个大数给小数的情况下,显式隐式编译器都通过,但是很有可能导致溢出,所以需要自己注意;
后一个系统自动会把b扩成4字节赋值给a(b还是1字节)
case 3:
int b=-;
unsigned int a;
a=b;
printf("%d\n",a);
这里unsigned int的范围是0~65535 ,其实当a=b后,a的值是65535,但输出却是-1;我一开始没有想通,加了显式转换之后试了一下还是-1,后来才知道%d输出是有符号的int类型,所以输出结果还是-1;
说到这个我想到之前一个学弟问我%e的问题;
那是书上的一个例子,输入用%e,输出却用%f,他一直奇怪为什么输出是71.820000而不是7.182000e+01;
你不用%e输出,怎么会看到7.182000e+01呢?就算你用%f输入%e输出也能看到这样的形式啊。
我觉得学语言不能光学个语法,重点需要了解数据是如何存在于计算机内部的。
你需要知道无论怎么样输入输出,同样的数据存在计算机里面是不变的,只是我们在屏幕上看到的显示方式不一样而已,就像一个月饼,有包装和无包装它就是个月饼,里面的馅还是那个馅。
扯的有点远了。今天先写到这里发出来吧。下次再补充,EDG炸了我看的很难受= =。
========================================================================================
2015/11/16 补充:
本次补充主要根据《The C Programming Language》
#include <stdio.h> int main()
{
short x = +;//-2 short x1 = ; //取余 但是可以为负数 short x2 = ; //取余后的最小非负整数
unsigned short y = ; //取余后的最小非负整数 printf("x1=%d x2=%d\n" , x1 , x2);
printf("y = %d\n", y );
return ; }
ps
当表达式中包含 u n s i g n e d 类 型 的 运 算 分 量 时 , 转 换 规 则 要 复 杂 一 些 。 主 要 问 题 是 , 在 有 符 号 值与无符号值之间的比较运算取决于机器,因为它们取决于各个整数类型的大小。例如,假定
i n t 对象占 1 6 位, l o n g 对象占 3 2 位,那么,- 1 L < 1 U ,这是因为 i n t 类型的- 1 U 被提升为 s i g n e d l o n g
类型;但- 1 L > 1 U L , 这 是 因 为 - 1 L 被提升为 u n s i g n e d l o n g 类 型 , 因 此 它 是 一 个 比 较 大 的 正 数 。
在进行赋值时也要进行类型转换, = 右边的值要转换成左边变量的类型,后者即赋值表达式
结果的类型。
如前所述,不管是否要进行符号扩展,字符值都要转换成整数值。
当把较长的整型数转换成较短的整型数或字符时,要把超出的高位部分丢掉。
C语言细节——献给入门者(三)的更多相关文章
-
C语言细节——献给入门者(一)
C语言细节——献给入门者(一) 主题 输入输出需要注意的细节 首先我们要知道大致有scanf(),printf(),getchar(),putchar(),gets(),puts()这几种输入方式. ...
-
C语言细节——献给初学者(二)
C语言细节——献给初学者(二) 主题 循环运用+选择判断 C语言循环有for和while/do...while: 选择判断有:if...else和switch...case 在循环中需要注意搭配br ...
-
Go 语言入门(三)并发
写在前面 在学习 Go 语言之前,我自己是有一定的 Java 和 C++ 基础的,这篇文章主要是基于A tour of Go编写的,主要是希望记录一下自己的学习历程,加深自己的理解 Go 语言入门(三 ...
-
Swift语言Auto Layout入门教程:上篇
原文:Beginning Auto Layout Tutorial in Swift: Part 1/2,译者:@TurtleFromMars 开始用自动布局约束的方式思考吧! 更新记录:该教程由Br ...
-
C语言细节总结笔记
C语言细节总结笔记 */--> C语言细节总结笔记 Table of Contents 1. 三步异或法交换数字 2. 做差法交换数字 3. 按n位置位 4. 求余求商求积 5. 辗除法求最大公 ...
-
学习swift语言的快速入门教程推荐
随着苹果产品越来越火爆,苹果新推出的swift必定将在很大程度上代替oc语言.学好swift语言,对于IOS工程师来讲,已经是一门必备技能. 有一些比较好的英文版教程,值得学习. 1. Swift T ...
-
加密入门(三):TrueCrypt(转)
http://terrychen.info/encryption-truecrypt/ TrueCrypt 是一款功能强大的开源加密工具,利用 TrueCrypt 可以创建一个加密文件作为虚拟加密卷, ...
-
ElasticSearch入门 第三篇:索引
这是ElasticSearch 2.4 版本系列的第三篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
-
SpringBoot入门(三)——入口类解析
本文来自网易云社区 上一篇介绍了起步依赖,这篇我们先来看下SpringBoot项目是如何启动的. 入口类 再次观察工程的Maven配置文件,可以看到工程的默认打包方式是jar格式的. <pack ...
随机推荐
-
Tomcat中的webapps中的web应用的文件结构
可仿造Tomcat中的webapps下的已有web应用的例子 具体文件结构如下:
-
ASP.NET 学习的总结
应用程序域 使用.Net建立的可执行程序*.exe,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中.应用程序域是.Net引入的一个新概念,它比进程所占用的资源要少,可以被看做 ...
-
.net MVC中JsonResult 返回类
/// <summary> /// 返回消息类 /// </summary> public class ReturnMessage { private IDictionary& ...
-
VC++实现生成右键菜单及添加图标
用VC++实现弹出菜单比较简单,这里介绍其中的一种来实现一个鼠标右键弹出菜单,效果如下图所示: 步骤: 一.新建一个基于对话框的MFC应用程序-----PopMenu 二.添加一个菜单资源------ ...
-
【Splay】例题
营业额统计 题目背景 HNOI2002 DAY2 T2 题目描述 Tiger 最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger 拿出了公司 ...
-
使用Ext JS,不要使用页面做组件重用,尽量不要做页面跳转
今天,有人请教我处理办法,问题是: 一个Grid,选择某条记录后,单击编辑后,弹出编辑窗口(带编辑表单),编辑完成后单击保存按钮保存表单,并关闭窗口,刷新Grid. 这,本来是很简单的,但囿于开发人员 ...
-
SAP CRM 开发学习资料和教程整理【不定时更新】
本文链接:http://www.cnblogs.com/hhelibeb/p/6276929.html 首先是SAP网站上面的相关内容 SAP Customer Relationship Manage ...
-
[Word]让字符重合显示
某些时候需要让字符重合显示,比如您好二字,显示为: 需要用到word的Advance域,他可以让后面的文字上下左右移动一定的磅. 譬如上面你好的显示:word中域代码为: 意思是好字向left移动了2 ...
-
hdu 4463 第37届ACM/ICPC杭州赛区K题 最小生成树
题意:给坐标系上的一些点,其中有两个点已经连了一条边,求最小生成树的值 将已连接的两点权值置为0,这样一定能加入最小生成树里 最后的结果加上这两点的距离即为所求 #include<cstdio& ...
-
linux查看进程开始时间
ps -eo pid,lstart|grep [pid] 命令解释: -e Select all processes. -o,o Specify user-defined format. pid a ...