Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[A05]C 语言数据类型及混合运算与类型转换 #9

Open
hylerrix opened this issue Sep 19, 2017 · 0 comments
Open

[A05]C 语言数据类型及混合运算与类型转换 #9

hylerrix opened this issue Sep 19, 2017 · 0 comments

Comments

@hylerrix
Copy link
Owner

hylerrix commented Sep 19, 2017

深入学习 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
  • 整型:
    • 有符号整型:int /signed [int] 4 byte -2147483648~2147483647
    • 无符号整型:unsigned [int] 4 byte 0~4294967295
  • 长整形:
    • 有符号长整型:long [int]/signed long [int] 4 byte -2147483648~2147483647
    • 无符号长整型:unsigned long [int] 4 byte 0~4294967295
  • 超长整型(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。
考虑到程序的可移植性,还是要将他们区分开来。但当要求的数值范围为 4 byte 时,建议使用int类型,因为第一版的 C 语言只有一种类型,那就是 int。(摘自百度文库)

浮点型

  • 单精度浮点型:float 4 byte -3.4E38~3.4E38
  • 双精度浮点型:double 8 byte 1.7E308~1.7E308 long double 8 byte

字符型

  • 有符号字符型:char/signed char 1 byte -128~127
  • 无符号字符型:unsigned char 1 byte 0~255
  • 宽字符型:wchar_t (unsigned short) 2 byte 0~65535

P.S:字符型赋值时可以是char c='a';也可以用字符对应的ASCII码赋值:char c=97;

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是一个指针变量,它指向一个指向整数型数据的指针变量

延伸可参考:基于指针的数据类型与指针运算小结

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)常见使用方法

  • 共用体类型:union

几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体。注:在某些书籍中可能称之为“联合体”,但是“共用体”更能反映该类型在内存的特点。在C语言中,定义一个共用体结构的一般形式为:

union 共用体名
{
    成员表列
}变量表列;

4. 空类型:void

常用在程序编写中对定义函数的参数类型、返回值、函数中指针类型进行声明。具体参考 void 百科

四、不同类型数据间的混合运算与类型转换

1.自动类型转换

在C语言中,自动类型转换遵循以下规则:

  • 若参与运算量的类型不同,则先转换成同一类型,然后进行运算
  • 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算
    • 若两种类型的字节数不同,转换成字节数高的类型
    • 若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
  • 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算
  • char型和short型参与运算时,必须先转换成int型
  • 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入

2. 强制类型转换

强制类型转换一般格式如下:(类型名)(表达式)。这种强制类型转换操作并不改变操作数本身。

参考链接

@hylerrix hylerrix changed the title [A05]思沃学院所带给我们的 [A05]「C语言」数据类型及混合运算与类型转换 Sep 20, 2017
@hylerrix hylerrix changed the title [A05]「C语言」数据类型及混合运算与类型转换 [A05]C 语言数据类型及混合运算与类型转换 Sep 20, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant