涉及各类数据类型的定义、内存存储、格式控制符,到常量变量、输入函数、类型转换及可移植整型等方面
C 语言数据类型核心知识点总结
一、整型(int)
1. 基本概念
- 定义:用于存储正整数、负整数和 0,关键字为int。
- 内存占用:典型尺寸为 4 字节(32 位),不同系统可能存在差异。
- 取值范围:有符号整型(signed int)为 - 2147483648 至 2147483647;无符号整型(unsigned int)为 0 至 4294967295。
2. 变量定义与初始化
- 语法:int 变量名 = 常量;(如int num = 100;)。
- 注意:赋值时需保证常量与变量类型一致,否则可能出现类型错误或警告。
3. 内存存储方式
- 有符号整型:首位为符号位(0 表示正数,1 表示负数),数据以补码形式存储。
- 正数:原码、反码、补码一致(如 3 的补码为0000 0011)。
- 负数:补码 = 绝对值的原码取反 + 1(如 - 3 的补码为1111 1101)。
- 无符号整型:无符号位,所有位均用于表示数据。
4. 整型修饰符
修饰符 |
说明 |
典型尺寸 |
char |
单字节整型(1 字节) |
1 字节 |
short int |
短整型,节省内存 |
2 字节 |
long int |
长整型,扩大取值范围 |
4 或 8 字节 |
long long int |
长长整型,更大取值范围 |
8 字节 |
unsigned |
无符号,仅表示非负整数 |
- |
5. 进制转换
- 内存存储:所有数据在内存中均以二进制存储。
- 表示方式:程序中可使用十进制(默认)、八进制(前缀 0)、十六进制(前缀 0x)。
- 转换技巧:先转为二进制,再按目标进制分组(如二进制转八进制每 3 位一组,转十六进制每 4 位一组)。
6. 格式控制符
控制符 |
说明 |
%d |
有符号 int 型 |
%hd |
有符号 short 型 |
%ld |
有符号 long 型 |
%lld |
有符号 long long 型 |
%u |
无符号 int 型 |
%hu |
无符号 short 型 |
%lu |
无符号 long 型 |
%llu |
无符号 long long 型 |
二、浮点型(float、double)
1. 基本概念
- 定义:用于存储小数,分为单精度(float)、双精度(double)和长双精度(long double)。
- 内存占用:float 为 4 字节,double 为 8 字节,long double 为 16 字节。
- 精度:占用内存越多,精度越高。
2. 内存存储(IEEE754 标准)
- 公式:(-1)^S * M * 2^E(S 为符号位,M 为有效数字,E 为指数位)。
- 单精度(32 位):1 位符号位 + 8 位指数位 + 23 位有效数字。
- 双精度(64 位):1 位符号位 + 11 位指数位 + 52 位有效数字。
3. 格式控制符
控制符 |
说明 |
%f |
单精度浮点型 |
%lf |
双精度浮点型 |
%Lf |
长双精度浮点型 |
%x.yf |
右对齐,占 x 宽度,保留 y 位小数 |
三、字符型(char)
1. 基本概念
- 定义:用于存储字符,本质是 1 字节的整型,关键字为char。
- 表示方式:字符常量用单引号括住(如'a'、'\n')。
2. 内存存储
- 字符以 ASCII 码值存储(0-127),可通过 man 手册或在线文档查询对应关系。
- 示例:'A'的 ASCII 码为 65,在内存中存储为0100 0001。
3. 格式控制符
控制符 |
说明 |
%c |
单个字符显示 |
%o |
八进制表示 |
%x |
十六进制表示(小写) |
%#o |
带 0 前缀的八进制 |
%#X |
带 0X 前缀的十六进制 |
四、字符串型(character string)
1. 基本概念
- 定义:由多个字符组成,以'\0'作为结束标志(隐藏在末尾)。
2. 内存存储
- 字符数组:char buf[16] = "shijie";,存储在栈区,可修改。
- 字符指针:char *p1 = "shijie";,指向常量区,不可修改。
- 长度计算:sizeof()包含'\0',strlen()不包含'\0'。
3. 格式控制符
控制符 |
说明 |
%s |
字符串输出 |
%-10s |
左对齐,占 10 宽度 |
%10s |
右对齐,占 10 宽度 |
五、布尔类型(bool)
- 定义:表示真(非零)或假(0),需包含头文件#include <stdbool.h>。
- 应用:常用于逻辑判断和循环控制。
六、常量和变量
1. 常量
- 定义:不可改变的量,包括整型、浮点型、字符型、字符串型等。
- 示例:100(int)、3.14(double)、'a'(char)、"nihao"(字符串)。
2. 变量
- 定义:可改变的量,需指定数据类型。
- 类型:int、float、char、字符串、bool 等,及它们的修饰拓展类型。
七、标准输入(stdin)
1. 相关函数
- scanf():格式化输入函数,原型为int scanf(const char *format, ...)。
- 注意:输入格式需与格式控制符严格匹配,否则数据可能遗留缓冲区。
- 返回值:成功读取的数据个数。
- getchar():从键盘读取一个字符,常用于清空输入缓冲区。
2. 输入缓冲区处理
- 若输入格式错误,数据会遗留缓冲区,需用while(getchar()!='\n');清空。
- 示例:scanf("%d", &num);后需清空缓冲区,避免影响后续输入。
八、数据类型的本质与类型转换
1. 本质
- 数据类型是对内存解释方式的约定,不同类型对应不同的内存解读规则。
2. 类型转换
- 隐式转换:系统自动进行,从小类型到大类型(如 char→int→float),避免精度丢失。
- 强制转换:用户显式转换,格式为(目标类型)变量(如(int)3.14),可能导致精度损失。
九、可移植整型
1. 问题背景
- 标准整型在不同系统中尺寸可能不同,影响代码移植性。
2. 解决方案
- 使用typedef定义固定尺寸的整型,如:
typedef signed char int8_t; typedef unsigned int uint32_t; |
- 优势:移植性强、可读性高、节省内存。
3. 常用可移植类型
类型 |
说明 |
int8_t |
8 位有符号整型 |
int16_t |
16 位有符号整型 |
int32_t |
32 位有符号整型 |
int64_t |
64 位有符号整型 |
uint8_t |
8 位无符号整型 |
uint16_t |
16 位无符号整型 |
uint32_t |
32 位无符号整型 |
uint64_t |
64 位无符号整型 |