目录
一、什么是数据类型?
二、数据类型的分类及其必要性。
1>数据类型的分类
2>数据类型的必要性:
三、进制;关键字与标识符;常量与变量;字节序。
1.进制
2.关键字与标识符
1>关键字
2>标识符(标识符的命名规则)
3.常量与变量
4.字节序
四、整型
1.整型的类型
2.整型的常量形式
3.整型的变量定义
4.整型大小
5.整型存储
1>整型分为正整型和负整型:
2>原码、反码、补码
3>CPU使用补码存储的原因:
6.整型数据范围
1>对于有符号型:
2>对于无符号型:
7.整型的溢出(上溢和下溢)
五、浮点型
1.浮点型的常量表示
2.浮点型的变量
3.浮点型的大小
4.浮点型的存储
1>IEEE754标准
2>小数的二进制转换
3>存储
5.浮点型的数值范围
6.浮点型的比较(精度)问题
六、字符型
1.编码
2.字符型的常量表示
3.字符型的变量
4.字符型的大小
5.字符型的存储
6.字符型数据的范围
7.转义字符
七、总结
八、修改记录
一、什么是数据类型?
数据类型是编程语言对数据的一种分类规则。它规定了:数据在内存中怎么表示;占多大内存;取值范围;能做哪些运算。数据的分类和规格,决定存储、范围和运算
二、数据类型的分类及其必要性。
1>数据类型的分类
2>数据类型的必要性:
数据类型分类的必要性可以概括为:
(1)确定内存表示和大小;
(2)确定取值范围;
(3)确定合法运算和语义;
(4)支持编译期类型检查;
(5)支持结构体、指针、数组等复杂构造;
(6)保证可移植性和标准一致性;
(7)帮助编译器优化和生成代码;
(8)支持跨平台通信和数据序列化;
(9)提高程序可读性和抽象能力;
(10)避免退化成手工字节操作。
三、进制;关键字与标识符;常量与变量;字节序。
1.进制
1>进制:二进制(B)、八进制(O)、十进制(D)、十六进制(H)。
2>进制间的转换,---十进制向其他进制转换,使用除R取余法(R为进制类型)。
---其他进制向十进制转换,使用加权求和法。
2.关键字与标识符
1>关键字
关键字是由 C 标准规定,预先定义,编译器识别,有特殊语法含义的保留字;用于声明类型、控制流程、定义存储方式等;大小写敏感,不能用作变量名、函数名等标识符。
C语言中的关键字:
2>标识符(标识符的命名规则)
标识符(identifier) 就是程序员自己起的名字,用来表示变量、函数、类型、结构体成员、标签等。
标识符的命名规则:
(1)只能由字母、数字、下划线组成
(2)不能以数字开头
(3)不能是关键字
(4)区分大小写
(5)不能包含空格、运算符、标点等
(6)不能和预处理命令等二级关键字重名:include、struct、union、if、return……
(7)不能和系统库函数重名:printf、scanf、sin、cos……库函数
(8)长度限制:C 标准保证内部标识符前 63 个字符有效,外部标识符前 31 个字符有效。实际使用时,建议不要起过长名字。
3.常量与变量
常量:在程序运行过程中,其值不能被改变的量称为常量。
变量:在程序运行过程中,其值 能被改变的量称为变量。
4.字节序
字节序(Endianness),也叫端序、字节顺序,指多字节数据在内存中存储时,各个字节的排列顺序。
小端序:高高低低,高位数据存放在高地址,低位数据存放在低地址。
大端序:高低高低,高位数据存放在低地址,低位数据存放在高地址。
举例:以int类型,int a=0x12345678,小端序。
在cpu内存中,每个地址存放一个字节。0x12345678可拆分为四个字节,其数据位由高到低,分别为:0x12、0x34、0x56、0x78。依据小端存储的高位数据存放在高地址,低位数据存放在低地址。0x12放在高地址0xFF06……0x78放在低地址0xFF03。
四、整型
1.整型的类型
int //整型
short //短整型
long //长整型
long long //长长整型
2.整型的常量形式
123 //十进制形式
0123 //八进制形式
0x123 //十六进制形式
无后缀的整型常量,如果其值能由int表示,则类型为int;
否则会根据进制和大小选择long、long long或相应的无符号类型。加上U、L、LL等后缀后,类型由后缀决定。
3.整型的变量定义
定义变量:数据类型 变量名;
int a; //定义一个整型变量a,并开辟存储空间;
int a = 10; //初始化一个整型变量a的初始值为10;
4.整型大小
空间的大小取决于类型的大小
*sizeof: sizeof 是一个运算符 --- 用来计算 运算数对应类型的大小(所在内存空间的字节数)
sizeof(a)
sizeof(int)
sizeof(1+2)
四种整型的大小:
int size = 4
short size = 2
long size = 8
long long size = 8
5.整型存储
计算机存储整型数据时存储的是其补码形式。
1>整型分为正整型和负整型:
signed//有符号类型,有正负符号。字符位(最高位) + 数值位(其余位)。
正整型符号位-----0: (0 0011111)= 31
负整型符号位-----1: (1 0011111)= -31
unsigned//无符号类型,只有正数。
2>原码、反码、补码
在cpu中如果进行四则运算则会非常复杂,存储占用大量内存,于是引申出原码,反码,补码的概念。在CPU中只有加法器。在C语言中整型数据使用补码存储。
原码:原本数字的二进制表示。
反码:原本数字的二进制值全部取反,若为signed类型,则最高位保留。
补码:在反码的基础上 + 1。
举例:int a = -123
原码:1000 0000 0000 0000 0000 0000 1111 1011
反码:1111 1111 1111 1111 1111 1111 0000 0100
补码:1111 1111 1111 1111 1111 1111 0000 0101
正数的原码、补码、反码是其本身。
对补码取补码是原码。
3>CPU使用补码存储的原因:
(1)减法和加法统一,只需加法器;
(2)符号位参与运算,不用单独处理符号;
(3)零只有一个表示,简化比较和判断;
(4)溢出判断简单;
(5)有符号和无符号共用加法电路;
(6)符合模运算,回绕自然;
(7)硬件成本最低,效率最高。
6.整型数据范围
1>对于有符号型:
以int举例,int数据的大小为四个字节----32个二进制位,将最高位作为符号位,其余31位作为数值位,则有符号int数据的取值范围为[-2^31~2^31-1],同理可得出其他有符号整型数据的取值范围。
2>对于无符号型:
[0~2^32-1]
7.整型的溢出(上溢和下溢)
当整型数据达到最大值再+1时,整型值会回到最小值。
unsigned short a = 65535; a = a + 1; printf("a = %d\n",a);结果为0;
unsigned short i = 0; for (i = 0; i < 65536; ++i) { printf(" i == %d\n",i); }此处i达到65535后+1为0,使得for循环一直运行,变成死循环。
输出结果为0-65535的不断循环。
五、浮点型
1.浮点型的常量表示
1.234
1.234e3 //e为科学计数法,指的是十的指数次方
1.234E-3 //同理
无后缀的浮点常量类型是double;
加f或F是float;
加l或L是long double。
2.浮点型的变量
定义形式:数据类型 变量名;
float //单精度
double //双精度
long double
float f; //定义变量f;
float f = 1.234 //初始化数值
3.浮点型的大小
sizeof(float) = 4 字节
sizeof(double) = 8 字节
sizeof(long double) = 16 字节
4.浮点型的存储
1>IEEE754标准
定义了浮点型的存储结构
float :
符号位 1位
指数位 (阶码位) 8位
尾数位 23位
double :
符号位 1位
指数位 (阶码位) 11位
尾数位 52位
2>小数的二进制转换
对于十进制形式的小数,采用乘二取整法:将小数部分*2,将整数部分余出,小数部分继续*2,直到没有小数部分。余出的数从上到下读取,即为小数部分的二进制代码。
以float f = 12.125举例:
0.125 =>
0.125 * 2 = 0.25 ... ... 0
0.25 * 2 = 0.5 ... ... 0
0.5 * 2 = 1.0 ... ... 1
小数部分结果:0.001
3>存储
将二进制形式的小数写为科学计数法形式:12.125的二进制小数形式为:1100.001=1.100001*2^3。
指数位偏移量127:其中存储指数位的值需要增加偏移量127。即,指数位的值位127 + 3 = 130.
以IEEE标准存储:float:1位符号位,8位指数位,23位尾数位。12.125的结果为0100 0001 0100 0010 0000 0000 0000 0000
5.浮点型的数值范围
以float为例:
float : 符号位 1位,指数位 (阶码位) 8位,尾数位 23位:
由于指数位为正负指数,存在偏移量+127,则指数位取值[-127~128]==>2^(-127)~2^128==>数值范围;
尾数位的大小决定其有效数的精准度,2^23==>8,388,608==>对应6~7位有效数。
6.浮点型的比较(精度)问题
对于小数0.9,进行乘2取整法时,存在无限循环部分,若进行比较运算,没有统一精度会存在问题。浮点型常数的默认类型为double型。
float f = 0.9; if(f==0.9){ printf("yes\n"); } else{ printf("no\n"); }此时f的默认精度为double双精度,输出结果为no。
将f类型定义为double型可解决问题。
六、字符型
1.编码
将一个字符存储到计算机时,无法存储其本身,使用编码将每个字符的存储用一个二进制数值替代。
ASCII编码:对常用的128个字符进行了编码,包括:
0~32 //不可见字符(控制字符)
48~57 //数字
65~90 //大写字母
97~122 //小写字母
2.字符型的常量表示
'a' //单引号,这个数据类型为整型
'\141' //编码的八进制形式对应的符号a,不常用
'\x61' //编码的十六进制形式对应的符号a,不常用
3.字符型的变量
定义形式:数据类型 变量名;
char c = 'a'; //定义一个char类型变量,初始化为'a'。
char c= 97; //定义一个char类型变量,初始化编码值为97,按照ASCII编码表对应字符“a”。
4.字符型的大小
一个字节
5.字符型的存储
字符型数据存储对应字符编码的二进制整型数据,以补码形式存储。
6.字符型数据的范围
存在signed和unsigned类型
signed char [-128~127]
unsigned char [0~255]
7.转义字符
转义字符是 C 语言中由反斜杠\引导的特殊字符序列,用来表示:
无法直接输入或显示的控制字符,如换行、制表;在语法中有特殊含义的字符,如引号、反斜杠;用八进制、十六进制或通用字符名表示的任意字符。它必须整体看,例如\n是一个字符,不是“反斜杠 + n”。
转义字符是一个字符。
举例:
printf("abc\tij#k\n"); printf("ab*c\t*de\rf\tg\n");结果为:
注意:\r将光标移动到最前面,如何f覆盖原有的a,g覆盖原有的*。
七、总结
今天学习了基础的数据类型以及相关知识。包括进制转换,关键字,标识符命名规则,常量与变量,字节序,转义字符等等,以及整型,浮点型,字符型的类型常量、变量定义、类型大小、取值范围、存储方式等等。
补充:CPU经常用来处理存储整型数据;GPU经常用来处理存储浮点型数据。
八、修改记录
2026.9.16:
修改了整型和浮点型常量在无后缀时的默认类型解释;
新增字符型常量的八进制和十六进制编码表示形式;
新增转义字符的举例。