C语言中的数据类型

    1. C数据类型
      • 1.1 基本类型
        • 1.1.1 数值类型
          • 1.1.1.1 整形

1) 短整型 short(short int)
2) 基本(整)型 int
3)长整型 long(long int)
引申:C语言如果表示整数的正或负,有无相应类型: 在以上整形类型前加上unsigned 表示正整数类型;以上类型如果没有用 unsigned 修饰,缺省就是正整数类型,把这样的类型称为无符号类型 在以上整形类型前加上 signed 表示负整数类型;把这样的类型称为有符号整数

  1. - 1.1.1.2 浮点型

1) 单精度型 float
2) 双精度型 double

     - 1.1.2 字符类型 char
  - 1.2 构造类型
     - 1.2.1 数组
     - 1.2.2 结构体 struct
     - 1.2.3 共用体 union
     - 1.2.4 枚举类型 enum
  - 1.3 指针类型
  - 1.4 空类型 void
  - 1.5 定义类型 typedef

C语言数据类型(2021.5.14) - 图1

  • C 语言数据的基本表现形式(在C语言中,数据的基本表现形式是常量和变量)
      1. 常量(在执行程序的过程中,其值不能被改变的量)
        • 常量分类:
          • int、float、double、char 和 符号常量。
          • 1.1 整型常量
            • 1.1.1 整型常量表示

可用十进制、八进制和十六进制三种形式表示:
(1)十进制整型常量:由0至9的数字组成以及+与-,不能以0 开头。如:123、-456.4
(2)八进制整型常量:以0(数字0)为前缀,其后由0到7的数字组成,没有小数部分。如:0123、-011
(3)十六进制整型常量:以0x或0X为前缀,其后由0到9的数字和A~F(或a~f) 字母组成,没有小数部分。如:0x12、-0x11
进制转换:
其他进制 -> 十进制:
“按权相加” 权:数位表示的单位

  • 例子:
    • 025 28^1 + 58^0 21
    • 0x25 216^1 + 516^0 37

十进制 -> 其他进制 :
不断除以 进制数,直到商为0,反向记录余数;
八进制 <—> 十六进制:
借助二进制转换
概念:
字节(byte): 内存单元的单位
二进制位(bit):一个字节又划分为 8个二进制位
整型常量中的长整型数据可用L作后缀表示。如:1234L等。

        - 1.1.2 整型常量的分类

三种类型的整型常量:
有符号 与 无符号 基本整型常量
C语言数据类型(2021.5.14) - 图2
C语言数据类型(2021.5.14) - 图3
有符号 与 无符号 长整型常量
有符号 与 无符号 短整型常量

     - 1.2 浮点型常量
        - C语言中的浮点数(float point number)就是平常所说的实数(real number)
        - 1.2.1 浮点型常量的表示形式

(1) 十进制小数形式,如0.123, 1.23, 123. 0, -17.8, 0.0等。
(2) 指数形式(科学记数法),如1230 可以表示为1.23e3或1.23E3
注意:
① 在符号 e 的前面必须要有数字。
② 在符号 e 的后面必须为整数,不能是带有小数点的实型数。
实型常量的后缀用F(或f)表示单精度型。后缀用L(或l)表示双精度型。不加后缀默认为双精度。

     - 1.3 字符常量
        - 用单引号括起来的一个字符,如:'a'、'A'、'?'等
        - 转义字符常量: 反以斜杠‘\’开头的字符序列 ,表示控制及不可见的字符。如:

C语言数据类型(2021.5.14) - 图4

        - 1.4 字符串常量

用一对双引号括起来的一个字符序列,如:“How do you do?”、“China”、“a”、“$123.45”等。可以输出一个字符序列,如:Printf(“How do you do.”);
字符串常量“a”与字符常量’a’的区别
C语言数据类型(2021.5.14) - 图5
系统自动为字符串常量加上结尾符“\0”,使所占内存单元多一个,但字符串常量的长度不变,可用sizeof( )运算符来测量。
1.5 符号常量
定义一个标识符来代表一个常量。如:用PI代表圆周率Л,即 3.1415926。(注意:定义符号常量时往往大写)
好处:
增加可读性。
增强了可维护性。
定义符号常量:
用编译预处理命令#define(宏定义)
格式:
#define 标识符 字符串
标识符和字符串之间用空格隔开。句末不用分号。
例:
#define PI 3.1415926
#define PRICE 38.5
例2:在程序中使用符号常量
C语言数据类型(2021.5.14) - 图6
#define PRICE 30 /定义符号常量PRICE/ #include void main( ) { int num,total; /定义整型变量/ num=10; /给变量赋值/ total=num PRICE; /符号常量参加运算*/ printf("total=%d\n", total); } 运行结果: total=300

    1. 变量(在程序执行过程中其中的值可以被改变的量)
      • 2.1 本质
        • 代表的是一块内存空间的标识,用来存放数据,也就是说,变量是数据的载体,变量是用来承载数据的。
      • 2.2 变量应该有一个名字
        • 以便按名字引用(使用)变量。可以通过变量名称访问该变量代表的内存空间,从而访问内存空间中的数据。
      • 2.3 变量定义格式
        • 变量格式:数据类型 变量名列表

例: #include int main() { int i=1; //初始化 i int j; j=1; //给 j 赋初值 }

     - 2.3.1 定义变量的过程
        - 1. 系统在内存中开辟内存空间;
        - 2. 开辟的内存空间的大小,取决于变量的类型;
        - 3. 以变量名作为该内存空间的表示(名称);
        - 4. 使用变量,相当于操作变量代表的内存空间;
        - 注意:在C语言中,要求对所用到的变量使用前必须先强制定义,即:先定义,后使用。
     - 2.3.2 变量名的命名规则
        - 变量名必须以字母或下划线开头,后面可以跟若干个字母、数字或下划线;
        - 变量名不能与C语言中已经存在的标识符重名
        - 变量名、变量值、变量所占存储单元之间的关系

C语言数据类型(2021.5.14) - 图7

        - C语言中的标识符

对标识符的定义 用来标识对象的名字的有效字符。对象包括变量、函数、数组、类型等。即标识符就是对象的名字。
标识符的构成
C语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个必须为字母或下划线(不能以数字开头)。
编译系统对大小写敏感。变量名一般用小写字母表示。
C语言中有3类标识符
关键字
有32个,系统有特定的含义和用途,如:float、 int、if、else等,不能用作变量名;
系统预定义的标识符
如系统提供的库函数名sin、printf、main及预编译命令define、include等;
用户标识符
用户定义的标识符,用来给程序中的变量、自定义函数、符号常量、数组、结构体、共用体、文件等命名。、
C语言中有32个关键字,不允许用户再用来定义标识符
C语言数据类型(2021.5.14) - 图8
12个预处理命令
C语言数据类型(2021.5.14) - 图9

  • 不同类型的数据在内存中的存放形式
      1. 用来存放整型数据的变量
        • 我们定义一个整型的变量,C编译系统实际是在内存中分配了能够存储一个整型数据的存储空间,并用变量名来标识这个空间,对该空间的使用也就可以通过变量名来访问。
        • 若不知道所用的C编译系统对变量分配的存储空间大小,可用sizeof运算符查询,如:printf(“%d,%d,%d\n”,sizeof(int),sizeof(short),sizeof(long));
          • 说明:
            • 一个类型说明语句可以同时定义多个同类型的变量,各变量之间用逗号“,”分隔。多个同类型的变量也可以用多 个类型说明语句定义;
            • 用类型说明语句定义的变量只是说明了为这些变量分配了存储空间,以便用于存放与之相同类型的数据,在未对这些变量赋值前,这些变量中(即存储空间中)的值是随机的;
            • C语言允许在定义变量的同时为变量赋初值;
            • 在为长整型变量初始化或赋值时,如果被赋数据为基本整型常量,则C编译系统自动将被赋数据转换成与相应变量的类型一致;
            • 由于各种整型变量所占的字节数有限,因此,它们所能存放的整数有一定的范围。
        • 例:整型变量的定义与使用

include void main() { int a,b,c,d; unsigned int u; a=12; b=-24; u=10; c=a+u; d=b+u; printf(“ a+u=%d, b+u=%6ld\n”,c,d); } 运行结果为: a+u=22 , b+u=-14

  - 1.1 整型数据在内存中的存放形式
     - 数据在内存中是以二进制形式存放的。
     - 如果有以下语句:

int i; /定义i为整型变量/ i=10; /给i赋整数10为值,若在内存中占2字节/

     - 则十进制数10的二进制形式为1010,在内存中的实际存放形式为: 0000000000001010
     - 实际上,数据在内存中是以补码的形式表示的
        - 正数的补码和原码(即该数的二进制形式)相同;
        - 负数的补码是将该数绝对值的二进制形式,按位取反再加1。
        - 例如-10的补码是:1111111111110110。因为:

C语言数据类型(2021.5.14) - 图10

        - 可见:在存放整数的存储单元中,一般情况下,最左边的一位用来表示符号位。符号位为“0” 时表示正数,符号位为“1”时表示负数。
    1. 浮点型变量
      • 2.1 浮点型变量的分类

C语言数据类型(2021.5.14) - 图11

  - 2.2 浮点型数据在内存中的存放形式
     - 浮点型数据在内存中按照指数形式存放。系统将一个浮点数分成小数部分和指数部分,分别存放。
        - ![](https://cdn.nlark.com/yuque/0/2021/png/21767570/1623045757801-47b608ae-9b23-428a-936b-acb178e97d1d.png#align=left&display=inline&height=148&margin=%5Bobject%20Object%5D&originHeight=148&originWidth=892&status=done&style=none&width=892)
        - 在内存中存放分为3部分:

最高位:符号位(0:正 1:负)
指数位:
单精度(浮点数二进制的指数 + 127)
双精度(浮点数二进制格式的指数 + 1023)
小数部分:浮点数二进制的小数部分
单精度:23 bits
双精度:52 bits

        - 例子:
        - 23.125 = 10111.001 = 1.0111001 * 2^4则内存中存放数据为 01000001101110010000000000000000
  - 3. 字符变量
     - 字符型变量用来存放字符常量。
     - 字符型变量的定义方式如为:char 变量名列表

C语言数据类型(2021.5.14) - 图12

     - 字符数据在内存中的存储形式及其使用方法
        - 将一个字符常量存入一个字符变量,实际上并不是把该字符本身存入内存单元中,而是将该字符对应的ASCII码存入内存单元中。

C语言数据类型(2021.5.14) - 图13

        - 由前可见,在内存中字符数据的存储形式与整型数据的类似,这就使得字符型数据和整型数据之间可以通用。即一个字符数据既可以字符形式输出,也可以整数形式输出。

以字符形式输出时,系统先将内存单元中的ASCII码转换成相应字符,然后输出。
以整数形式输出时,直接将ASCII码作为整数输出。
因此,可以对字符数据进行算术运算,这时相当于对其ASCII码进行算术运算。
C语言数据类型(2021.5.14) - 图14
C语言数据类型(2021.5.14) - 图15
C语言数据类型(2021.5.14) - 图16

     - <br />
  • 各类数值型数据间的混合运算
    • 1)整型、实型、字符型数据间可以进行混合运算,如:10-‘a’*1.5
      • 运算时,参加运算的两个数据如果类型不同,则首先将其类型转换成一致再运算,转换规则是:将优先级低的类型转换到优先级高的类型
      • 注意:在混合运算过程中,系统所进行的类型转换并不改变原数据的类型,只是在运算过程中将其值变成同类型后再运算。

C语言数据类型(2021.5.14) - 图17

  - 注意:在混合运算过程中,系统所进行的类型转换并不改变原数据的类型,只是在运算过程中将其值变成同类型后再运算。
  • 2)C语言提供了强制类型转换运算,可得到一个所需类型的数据。强制类型转换的形式为:(类型名)(表达式)

C语言数据类型(2021.5.14) - 图18

  - 特别需要说明的是,在强制类型转换过程中,并不改变原变量的类型,只是在运算过程中将其值转换类型后再运算。
  - 例:

C语言数据类型(2021.5.14) - 图19

  • 主要的算术运算符和算术表达式
      1. C语言运算符和C算术表达式简介
        • 1.1 C运算符
          • 1)算术运算符 + - * / %
          • 2) 关系运算符 > < >= <= == !=
          • 3) 逻辑运算符 ! && ||
          • 4) 位运算符 << >> ~ ! ^ &
          • 5) 赋值运算符 = += -= *= /= %=
          • 6) 条件运算符 ? :
          • 7) 逗号运算符 ,
          • 8)指针运算符 * &
          • 9) 求字节数运算符 sizeof
          • 10)下标运算符 [ ]
          • 11) 强制类型转换运算符(类型)
          • 12)分量运算符 . ->
          • 13)其它 如函数调用运算符( )
        • 2.2 表达式
          • 所谓表达式是将操作对象用运算符连接起来的符合C语法规则的式子
          • 1) 算术运算符 2+6.7*3.5+sin(0.5)
          • 2)关系运算符 x>0, y<=z+6
          • 3) 逻辑运算符 x>0&&y>0 表示x和y同时大于0时条件成立
          • 4)赋值运算符 a=5.6
          • 5)逗号运算符 x=3, y+=4, z-=8 结果是最后一个表达式的值8
          • C语言规定了运算符的优先级和结合性。在表达式求值时,按运算符的优先级别高低次序执行。如果运算对象两侧的运算符优先级别相同,如a+b-c,则按规定的“结合方向”处理。
          • 2.3 主要的算数运算符
            • 2.3.1 基本的算术运算符
  • 加法运算符(双目运算符),或正值运算符(单目运算符),如 3+5,+3。
    - 减法运算符(双目运算符),或负值运算符(单目运算符),如 5-2,-z。
    乘法运算符(双目运算符),如y3。
    / 除法运算符(双目运算符),如5/3。注:两个整数相除得整数商
    % 模运算符(双目运算符),或求余运算符。只适用于整型数据,如12%5的值为2,32%11的值为10等。
    这些算术运算符的运算顺序与数学上的运算顺序相同。
    2.3.2 C语言运算符的优先级
    C语言数据类型(2021.5.14) - 图20

      1. 算术表达式和运算符的优先级与结合性
        • 算术表达式是指用算术运算符和括号将运算对象连接起来的、符合C语法规则的式子, 称为C算术表达式。 如:a*b/c-1.5+’a’
        • 对于算术表达式要注意以下几个问题:
          • 1)表达式中各种运算符的运算顺序,必要时应加括号,
            • 例如:

(a+b)/(c+d)≠a+b/c+d。

     - 2) 注意表达式中各运算对象的数据类型,特别是整型相除。C语言规定,两个整型量相除,其结果仍为整型。
        - 例如:

7/6的值为1;
4/7的值为0;
(1/2)+(1/2)的值为0,而不是1。

  - 优先级与结合性
     - 在表达式求解时,先按运算符的优先级别高低次序执行,若一个运算对象两侧的运算符的优先级别相同,则按规定的结合方向处理。
        - 各种运算符的结合方向:

1) 算术运算符的结合方向是:“自左至右”,即运算对象先与左边的运算符结合,例如:a-b+c 先执行a-b,然后在执行加C运算
2) 有些运算符的结合方向是:“自右至左”,即运算对象先与右边的运算符结合,例如:i++
3) 若一个运算符两侧的数据类型不同,会自动转换成同类型后进行运算

  - 自增++ 、自减--运算符
     - ++i,--i 表示在使用该运算对象之前使先它的值增1或减1,然后再使用它,即使用的是增1或减1后的值。
        - 例如:

语句x=++n;相当于以下两个语句的运算结果:n=n+1;x=n;

     - i++,i-- 表示在使用该运算对象之后才使它的值增1或减1,即使用的是增1或减1前的值。
        - 例如:

语句x=n++;相当于以下两个语句的运算结果:x=n;n=n+1

     - 注意:
        - 1)增1与减1运算符只适用于整型变量或字符型变量,而不能用于其他类型的变量;
        - 2) 增1与减1运算符不能用于常量或表达式。例如,--5, (i+j)++等都是非法的。
  - 赋值运算符
     - “=”称赋值运算符,其作用是将一个数据赋给一个变量。如: a=5不要理解为“等号”。
     - 执行赋值运算的结果,是将右边的数据存入左边变量所对应的内存单元中。
     - 赋值规则
        - 如果赋值运算符两侧的类型不一致,则在赋值时要进行类型转换,转换规则为:

实型 -> 整变量
舍去小数部分。
int a=5.5; a中为5。
整型 -> 实变量
数值不变,以浮点形式存储。
字符型 -> 整变量
放在整形变量低8位。保持原值不变原则。int a=‘A’;

     - 赋值表达式
        - 主要实现赋值运算的表达式。
        - 一般形式:

<变量>=<表达式>
如: a=5 y=2*x+3 a=a+1 不是衡等

     - 作用:将右边表达式的值赋给左边的变量。赋值表达式的值取左边变量的值。
  - 逗号运算符
     - 用途:将若干个表达式“串联”起来,如:3+5,6+8;(a=3*5,a*4),a+5
     - 别称:顺序求值运算符
     - 逗号表达式
        - 一般形式为:表达式1,表达式2,...,表达式n
        - 求解过程:按从左到右的顺分别计算各表达式的值,其中最后一个表达式n的值就是整个逗号表达式的值。
  • 本章小结:
    • 各类数据在内存中所占的字节数。ANSI C没有具体规定,由各C编译系统自行决定。常见的有两种:
    • short型2字节、 int型4字节、 long型4字节
    • 对字符型都是1字节
    • 对浮点数一般都是:float型4字节、 double型8字节
    • 可用运算符sizeof(类型名)或 sizeof(变量名)测出其字节数。
    • 区别字符和字符串。单引号括起来的是字符,占1个字节;尚引号括起来的是字符串,占n+1个字节,因为有结尾符“\0”。一个字符(char)型变量中只能存放1个字符。
    • 自增++和自减—运算符,只能用于变量,不能用于常量和表达式。

以上内容整理于 幕布文档
set 限制解除