1. 变量的补充:scanf 函数与缓冲区
1.1 scanf 函数的工作原理
- 输入缓冲区:
- 当用户通过键盘输入数据时,系统会先将数据存入输入缓冲区。
- 缓冲区是内存空间的一部分,用于临时存储输入输出数据,以提高程序运行效率。
scanf的行为:scanf会从输入缓冲区中逐个取出内容,并将其赋值给变量。- 如果输入缓冲区不为空,
scanf会直接从缓冲区中获取数据,而不会要求用户再次输入。
1.2 scanf 清空缓冲区
- 问题:
- 如果输入缓冲区中残留了无效数据(如回车、空格等),可能会导致
scanf行为异常。
- 如果输入缓冲区中残留了无效数据(如回车、空格等),可能会导致
- 解决方法:
- 使用
setbuf(stdin, NULL)清空输入缓冲区。 - 示例:c
setbuf(stdin, NULL); // 清空输入缓冲区 scanf("%d", &num); // 重新读取用户输入
- 使用
1.3 scanf 的注意事项
scanf在读取数字时会跳过空格、制表符和回车。- 示例:c
int num1 = 0, num2 = 0; printf("input num1: "); scanf("%d", &num1); // 读取第一个数字 printf("num1 = %d\n", num1); printf("input num2: "); scanf("%d", &num2); // 读取第二个数字 printf("num2 = %d\n", num2);
2. 整型数据类型的补充
C语言中,整型数据类型包括 short、int、long 和 long long,每种类型的有符号和无符号版本。
2.1 整型数据类型的特点
占用空间和表示范围:
- 不同操作系统和位数(如 16 位、32 位、64 位)下,整型数据类型的占用空间和表示范围可能不同。
- 以 64 位 Windows 环境为例:
数据类型 占用空间 表示范围 占位符 char1 字节 -128 ~ 127 %cunsigned char1 字节 0 ~ 255 %cshort2 字节 -32768 ~ 32767 %hdunsigned short2 字节 0 ~ 65535 %huint4 字节 -2147483648 ~ 2147483647 %dunsigned int4 字节 0 ~ 4294967295 %ulong4 字节 -2147483648 ~ 2147483647 %ldunsigned long4 字节 0 ~ 4294967295 %lulong long8 字节 -2^63 ~ 2^63-1 %lldunsigned long long8 字节 0 ~ 2^64-1 %llu
示例:
cint a = 1; short b = 2; long c = 3; long long d = 5; unsigned long e = 6;
3. 进制转换:十进制与二进制
3.1 十进制转二进制
整数部分(除 2 取余法):
- 将十进制数不断除以 2,记录余数。
- 将余数逆序排列,得到二进制结果。
- 示例:将 13 转换为二进制
13 / 2 = 6 余 1 6 / 2 = 3 余 0 3 / 2 = 1 余 1 1 / 2 = 0 余 1- 余数逆序排列:1101(二进制)。
小数部分(乘 2 取整法):
- 将小数部分不断乘以 2,记录整数部分。
- 将整数部分顺序排列,得到二进制结果。
- 示例:将 0.6 转换为二进制
0.6 * 2 = 1.2 → 1 0.2 * 2 = 0.4 → 0 0.4 * 2 = 0.8 → 0 0.8 * 2 = 1.6 → 1- 整数部分顺序排列:1001(二进制)。
3.2 二进制转十进制
- 方法:
- 将二进制数的每一位乘以 2 的幂次方(从右到左,幂次从 0 开始)。
- 将所有结果相加,得到十进制数。
- 示例:将 1101 转换为十进制
1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 8 + 4 + 0 + 1 = 13(十进制)
总结
scanf函数与缓冲区:scanf从输入缓冲区中读取数据,缓冲区残留数据可能导致问题,可通过setbuf(stdin, NULL)清空缓冲区。
- 整型数据类型:
- 包括
short、int、long和long long,每种类型的有符号和无符号版本占用空间和表示范围不同。
- 包括
- 进制转换:
- 十进制转二进制:整数部分用除 2 取余法,小数部分用乘 2 取整法。
- 二进制转十进制:按位乘以 2 的幂次方并相加。
