
本章介绍C语言中数据的表示方式包括变量与常量、基本数据类型、存储方式及类型相关的操作。一、示例程序先看一个使用不同数据类型的简单程序#include stdio.h int main(void) { int num 100; // 整型 float pi 3.14159f; // 单精度浮点型 char ch A; // 字符型 double large 1.23e12; // 双精度浮点型 printf(整数: %d\n, num); printf(浮点数: %.5f\n, pi); printf(字符: %c (ASCII %d)\n, ch, ch); printf(科学计数: %e\n, large); return 0; }通过这个程序可以直观看到几种基本数据类型的声明和使用方式。二、变量与常量数据变量程序中用来存储数据的命名存储区域其值在运行过程中可以改变。必须先声明后使用声明时确定类型和名称可选初始化。int count 0;常量数据程序运行期间值不能改变的量。字面常量直接写出的数值如100、3.14、A符号常量使用#define或const定义如#define PI 3.14159或const double PI 3.14159;三、数据数据类型关键字概览C语言通过数据类型关键字来定义变量的类型主要分为以下几类基本类型关键字int、long、short、unsigned、signed、char、float、double、_Bool复数与虚数类型很少直接使用_Complex、_Imaginary类型修饰与扩展signed、unsigned、short、long可以和int、char组合产生变体。这些关键字决定了数据在内存中的存储方式和占用空间。3.1 计算机存储方式整数与浮点数位bit最小的存储单元可以存储0或1。字节Byte最常用的计算机存储单位1字节 8位。字Word计算机设计的自然存储单位通常为16位、32位或64位取决于体系结构。3.2 整数存储整数以二进制补码形式存储能精确表示其范围内的每一个值。3.3 浮点数存储浮点数被分成符号位、指数部分和尾数部分来存储遵循IEEE 754标准。浮点数在表示很大或很小的数时非常有优势但不能精确表示所有实数算术运算时可能产生舍入误差。四、C语言基本数据类型4.1int类型有符号整数通常占用一个机器字长现今多为32位或64位。声明示例int age;或int year 2026;打印用%d输出十进制整数。八进制和十六进制输出%o八进制不带前缀。%x或%X十六进制不带前缀。若想显示前缀使用%#o显示0、%#x显示0x或%#X显示0X。int num 255; printf(十进制: %d\n, num); // 255 printf(八进制: %#o\n, num); // 0377 printf(十六进制: %#x\n, num); // 0xff4.2 其他整数类型C语言提供多种整数变体以适应不同范围需求类型含义常见大小位打印格式十进制short int或short短整型16%hdlong int或long长整型32/64%ldlong long int长长整型64%lldunsigned int无符号整型与int相同%uunsigned short无符号短整型16%huunsigned long无符号长整型32/64%luunsigned long long无符号长长整型64%llu使用注意事项C标准只规定了各类型最小允许范围具体大小由实现决定。可借助sizeof获取字节数。在long和int占用空间相同的平台上若希望代码可移植应使用long来存储可能超过int范围的数。长整数常量后缀L或l如100L表示long类型LL表示long long。也可用于八进制或十六进制常量。无符号常量后缀U或u可与L组合如100UL表示unsigned long。溢出问题有符号整数溢出属于未定义行为无符号整数溢出会回绕取模。打印八进制或十六进制长整型%lo、%lxshort类型八进制用%ho。long long big 1234567890123LL; printf(%lld\n, big); unsigned long ul 4000000000UL; printf(%lu\n, ul);4.3char类型用于存储字符但实际上存储的是字符对应的数值ASCII码或扩展编码。占用1字节8位。字符常量用单引号括起来如A、9、$。字符是以数值形式存储的A在ASCII中对应整数65。C将字符常量视为int类型。打印字符用%c输出字符本身也可用%d输出其对应的整数编码。char c A; printf(字符: %c, 编码: %d\n, c, c); // 输出: 字符: A, 编码: 65有符号/无符号char默认可能是有符号或无符号由编译器决定。显式声明可用signed char通常范围-128~127和unsigned char0~255。非打印字符一些控制字符无法直接输入使用转义序列表示。常用转义序列如下转义序列含义ASCII值十进制\a警报响铃7\b退格8\f换页12\n换行10\r回车13\t水平制表9\v垂直制表11\\反斜杠92\单引号39\双引号34\0oo八进制值oo为1~3位八进制数字—\xhh十六进制值hh为1~2位十六进制数字—示例printf(第一行\n第二行\t缩进后\a警告声); char single_quote \; char backslash \\; printf(%c %c, single_quote, backslash);关于\a“活跃位置”指显示设备上下一个字符将出现的位置\a触发警报声但不改变活跃位置即不移动光标。字符串用双引号括起来的字符序列无需单引号。例如Hello, World!。4.4_Bool类型C99引入的布尔类型只能存储值0假或1真。若包含stdbool.h头文件可直接使用bool、true、false。_Bool flag 1; #include stdbool.h bool done false;任何非零值赋值给_Bool变量都会被转换为1。4.5 可移植类型stdint.h 和 inttypes.h为了解决各平台整数大小不一致问题C99引入了精确宽度整数类型定义在stdint.h中。它们是可选的如果平台不支持则不会定义。常见类型精确宽度int32_t、uint16_t等。最小宽度int_least8_t至少8位、int_least32_t等。快速宽度int_fast16_t等追求运算速度。最大宽度intmax_t、uintmax_t。打印这些类型时使用inttypes.h中定义的字符串宏。例如PRId32是打印int32_t的格式说明符。#include inttypes.h int32_t val 1000; printf(% PRId32 \n, val); // 输出 10004.6 浮点型float、double、long doublefloat单精度通常4字节有效数字约6-7位。double双精度通常8字节有效数字约15-16位。long double扩展精度依赖实现。浮点型常量默认以double类型存储。若希望指定为float添加后缀f或Flong double加l或L。科学计数法-1.56E12表示 -1.56×10¹²87e-3表示 0.087。十六进制浮点常量C990xa.1fp10。a.1f十六进制对应十进制 10 1/16 15/256乘以 2¹⁰ 即1024。float f 3.14f; double d 2.718281828; long double ld 1.23456789L; printf(%.10f %.10f %.10Lf\n, f, d, ld);4.7 复数与虚数类型C99引入了复数算术的支持若编译器实现包含类型float _Complex、double _Complex、long double _Complex以及可选的关键字_Imaginary。在包含complex.h后可用complex宏及I表示虚数单位。实际编程中较少直接使用多用于数值计算领域。4.8 其他类型void无类型主要用于函数返回、函数参数、通用指针。enum枚举类型定义命名整数常量。派生类型数组、指针、结构体、联合体等。4.9 类型大小sizeof运算符sizeof以字节为单位给出指定类型或变量的大小。语法sizeof(类型)或sizeof 变量返回size_t类型通常用%zu打印。printf(int: %zu 字节\n, sizeof(int)); printf(double: %zu 字节\n, sizeof(double)); int a; printf(a: %zu 字节\n, sizeof a);五、使用数据类型类型转换与赋值把浮点数赋给整数变量时直接丢弃小数部分不进行四舍五入只保留整数部分。int i 3.99; // i 的值为 3不同类型数值在运算时会进行隐式类型转换通常向更高级别提升如int→double。强制类型转换(类型)表达式如(int)3.99结果为3。六、参数匹配与陷阱使用printf和scanf时参数必须与格式字符串中的占位符严格匹配否则会产生未定义行为类型不符如用%d打印long可能导致输出错误或崩溃。参数数量与占位符不一致也会出现问题。编译器可能不会检查这些错误需程序员格外小心。七、转义序列示例与缓冲区刷新7.1 程序运行情况下面的程序展示了部分转义序列的效果#include stdio.h int main(void) { printf(AB\bC\n); // 输出 A C? (退格将B擦除可能显示为 AC) printf(12345678\rABCD\n);// 输出 ABCD5678? (回车回到行首覆盖1234) printf(Alert sound\a\n); // 发出警告声 return 0; }实际输出可能因终端而异。7.2 刷新输出printf默认将输出发送到缓冲区然后根据一定条件将缓冲区内内容刷新flush到屏幕。缓冲区的刷新时机缓冲区满。遇到换行符\n行缓冲模式下。程序正常结束。需要输入时如scanf之前输出会被刷新。显式调用fflush(stdout)。为了确保信息立即显示可在必要处使用换行符或fflush。八、关键概念ASCII码American Standard Code for Information Interchange用数值表示字符的标准编码方案。标准ASCII使用7位编码可表示128个字符0~127。例如0为48A为65a为97。C语言char类型通常基于ASCII或扩展编码如Latin-1、UTF-8起始段处理字符。理解字符与数字的对应关系是掌握C语言输入输出和字符串处理的基础。总结数据以变量或常量的形式存储变量需声明类型。常用基本类型int、char、float、double以及它们的修饰变体。字符通过ASCII码存储转义序列表示特殊字符。sizeof用于确定类型大小类型转换需注意精度损失。格式化输出时注意占位符与参数匹配了解缓冲区刷新机制有助于控制输出时序。