「C语言」数据类型及混合运算与类型转换
深入学习C语言时,有必要先了解一下数据类型的概念,以及它们之间的混合运算与类型转换。
本篇文章便是根据《C语言程序设计教程》和在线翻阅资料后整理而出。(练习题将逐步更新)
目录:
一、概述
二、类型修饰符
三、各种数据类型介绍
四、不同类型数据间的混合运算与类型转换转换
五、练习
一、概述
程序所能处理的基本数据对象被划分成一些组或一些集合。它们都采用同样的编码方式,对它们能做同样的操作。把程序中具有这样性质的集合,成为数据类型。CPU对不同的数据类型提供了不同的操作指令
C语言中的类型按其组成可以分为简单类型和构造类型,按是否预定义了类型名字和值集可以分为基本类型和非基本类型,按是否加了类型限定符可以分为限定类型和非限定类型
用ProcessOn作图,C语言数据类型如下:

二、类型修饰符
除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:
1.signed----有符号,可修饰char、int。int是默认有符号的
2.unsigned-----无符号,修饰int 、char
3.long------长型,修饰int 、double
4.short------短型,修饰int
三、各种数据类型介绍
1.基本数据类型
(以下各数据类型字长均指32位操作系统下,可用printf("%d",sizeof(数据类型名));进行测试。具体字长由具体编译器决定,但确定的关系是:sizeof(short)≤sizeof(int)≤sizeof(long))
整型:整形包括短整型、整形和长整形
短整型:
有符号短整型:short [int] 2byte -32768~32767
无符号短整型:unsigned short [int] 2 byte 0~65535
整型:
长整形:
有符号长整型:long [int]/signed long [int] 4 byte -2147483648~2147483647
超长整型(C99 标准添加的类型):long long [int] 8 byte 0~18446744073709552000
P.S(C语言中整型和长整形都占4字节的原因):
早期的C编译平台下整形和长整型分别是2和4字节。随着编译平台版本的升级,现在二者都是4字节,short是2字节。另外整型数的字长与CPU的字长没有密切关系:早期的int是2字节,但那时的CPU也已经是32位的了;再者你把现在4字节int编译平台安装在64位CPU机上去,同样只能编译4字节int的代码,并不因为CPU成8字节了,你代码中的int也成8字节了。(摘自百度知道)
long从字面上看,应该是64位才更合理,把long当成32位实在是一个历史的包袱。像C#那样新起炉灶的程序语言,由于没有需要支持老代码的问题,就把long当作64位来处理了。
在32位平台下,long是相对short而言,long(short)类型是long(short)int类型的简称,sizeof(long) = sizeof(int) = 4。int和long的范围虽然一样,但输入输出格式不同,printf int的格式为%d,而printf long的格式为%ld。
考虑到程序的可移植性,还是要将他们区分开来。但当要求的数值范围为4byte时,建议使用int类型,因为第一版的C语言只有一种类型,那就是int。(摘自百度文库)
浮点型:
单精度浮点型:float 4 byte -3.4E38~3.4E38
双精度浮点型:double 8 byte 1.7E308~1.7E308 long double 8 byte
字符型:
2.指针类型:
有关指针的数据类型
int i ————定义整形变量i
int *p———- p为指向整型变量的指针变量
int a[n]——- 定义整型数组a,它有n个元素
int *p[n]—– 定义指针数组p,它由n个指向整型数据的指针元素组成
int (*p)[n] —p为指向含n个元素的一维数组的指针变量
int f()——— f为返回整数型函数值的元素
int *p()——- p为返回一个指针,该指针指向整型数据 或 整形数组
int (*p)() —–p为指向函数的指针,该函数返回一个整数值
int **p—- —-p是一个指针变量,它指向一个指向整数型数据的指针变量
延伸可参考:基于指针的数据类型与指针运算小结 http://www.jb51.net/article/41051.htm
3.构造类型:struct
C语言构造类型分为:数组类型,结构类型和共用体类型
数组类型:是由相同基本类型若干个元素组织在一起数据,它们有先后顺序,也可以按这个顺序对这些元素访问
如int a[10],共有10个元素,第个元素的类型都相同,都为整型
这10 个元素,按顺序分别是a[0]、a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9]
结构体类型:在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问
在C语言中,定义一个结构的一般形式为:
struct结构名
{
//成员表列
};
延伸可参考:C语言结构体(struct)常见使用方法 http://blog.csdn.net/huqinwei987/article/details/23625823
共用体类型:union
几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体。注:在某些书籍中可能称之为“联合体”,但是“共用体”更能反映该类型在内存的特点
在C语言中,定义一个结构的一般形式为:
union 共用体名
4.空类型:void
常用在程序编写中对定义函数的参数类型、返回值、函数中指针类型进行声明。
具体参考void百科 http://baike.baidu.com/item/void/5126319?fr=aladdin
四、不同类型数据间的混合运算与类型转换
1.自动类型转换
在C语言中,自动类型转换遵循以下规则:

①若参与运算量的类型不同,则先转换成同一类型,然后进行运算
②转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算
a、若两种类型的字节数不同,转换成字节数高的类型
b、若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
③所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算
④char型和short型参与运算时,必须先转换成int型
⑤在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入
2.强制类型转换
强制类型转换一般格式如下:
(类型名)(表达式)
这种强制类型转换操作并不改变操作数本身
五、练习题
(练习题将逐步更新)
参考链接:
C语言基本数据类型简介:http://www.cnblogs.com/onedime/archive/2012/11/21/2780149.html
深入解析unsigned int 和 int http://www.jb51.net/article/40518.htm
「C语言」数据类型及混合运算与类型转换的更多相关文章
- 「C语言」常量和变量的表示、应用和变量命名规则
在程序运行中,其值不能改变的量成为常量. 在基本数据类型中,常量可分为整型常量.实型常量.符号常量和字符型常量(包括字符常量和字符串常量),现分别介绍如下: 目录: 一.常量 二.C语言标识符 三.变 ...
- 「C语言」文件的概念与简单数据流的读写函数
写完「C语言」单链表/双向链表的建立/遍历/插入/删除 后,如何将内存中的链表信息及时的保存到文件中,又能够及时的从文件中读取出来进行处理,便需要用到”文件“的相关知识点进行文件的输入.输出. 其实, ...
- 「C语言」Windows+EclipseCDT下的C语言开发环境准备
之前写过一篇 「C语言」在Windows平台搭建C语言开发环境的多种方式 ,讨论了如何在Windows下用DEV C++.EclipseCDT.VisualStudio.Sublime Test.Cl ...
- 「C语言」原码反码补码与位运算
尽管能查到各种文献,亲自归纳出自己的体系还是更能加深对该知识的理解. 本篇文章便是在结合百度百科有关原码.反码.补码和位运算的介绍并深度借鉴了张子秋和Liquor相关文章后整理而出. 目录 ...
- 「C语言」单链表/双向链表的建立/遍历/插入/删除
最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...
- 「C语言」int main还是void main?
从大一入学刚接触C到现在已满7个月了,虽然刚开始就知道```int main```才是标准的写法,但一直没有深刻理解为什么不能用```void main```而必须使用```int main```. ...
- 「C语言」C输出hello world!系统发生了什么?
本篇文章全部摘抄自学长博客供以后学习: http://efraim.me/2015/12/05/tech-linux-2015-12-05/ 排版因与博客园编辑器不同而稍作修改. 输出hello wo ...
- 「C语言」在Windows平台搭建C语言开发环境的多种方式
新接触C语言,如何在Windows下进行C语言开发环境的搭建值得思考并整理. 以下多种开发方式择一即可(DEV C++无须环境准备). 注:本文知识来源于 Windows 平台搭建C语言集成开发环境 ...
- 「Redis 笔记」数据类型
REmote DIctionary Server(Redis),一个 key-value 存储系统. 数据类型 Redis 支持五种数据类型:string(字符串),hash(哈希),list(列表) ...
随机推荐
- Orcale 之基本术语一
数据字典 数据字典是 Orcale 的重要组成部分.它有一系列的拥有数据库元数据信息的数据字典表和用户可以读取的数据字典视图组成,存放着数据库的有关信息.因此数据字典可以看作一组表和试图的集合.它们存 ...
- ExtJs6内嵌iframe,nginx部署本地前台文件
/** * Created by Wwei on 2016/9/1. */ Ext.define('Admin.view.photo.CADMultiUploadForm', { extend: 'E ...
- golang学习之闭包
匿名函数不能够独立存在,但可以被赋值于某个变量,即保存函数的地址到变量中:fplus := func(x, y int) int { return x + y },然后通过变量名对函数进行调用:fpl ...
- thinkjs crud练习
今天看了下thinkjs(v2.1.7),做了一个简单的入门demo,基于mysql数据库增删改查,详细源码如下: 页面整体展示: 会员新增: 删除: 查询: 主页面: <!DOCTYPE ht ...
- SQL练习(一)
查找今天过生日的同学 这里表中已经存储了生日,所以思路是取出date_birth去今天的日期相比较 SELECT NAME,date_birth FROM org_mhi_studentfiles W ...
- java 2018面试题-多线程汇总(含解答)
学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行总结的,因此罗列了自己整理的多线程的问题,都是自己觉得比较经典和一些大企业面试会问 ...
- AngularJS模块之$scope
Angular中创建一个模块: angular.module("myApp",[]). controller("myController",function(& ...
- js数组方法 改变原数组和不改变原数组的方法整理
改变原数组: pop(): 删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值.如果数组已经为空,则 pop() 不 改变数组,并返回 undefined 值 ...
- 基础架构之Docker私有库
由于项目要容器化,所有搭建自己的镜像库也是很有必要的,不然发到直接使用官方的镜像库,速度绝对能让你头疼,这篇文章就介绍搭建自己的镜像私有库. (一) 环境要求 Centos 7.5.1804 Doc ...
- spring org.springframework.web.bind.annotation 常用注解
开发中常用的注解记录,查缺补漏 Request注解 @RequestBody @RequestHeader @RequestMapping @RequestParam @RequestPart @Co ...