ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Linux嵌入式学习——数据类型

Linux嵌入式学习——数据类型

目录

一、什么是数据类型?

二、数据类型的分类及其必要性。

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:

修改了整型和浮点型常量在无后缀时的默认类型解释;

新增字符型常量的八进制和十六进制编码表示形式;

新增转义字符的举例。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进