数据和C
数据和C
关键字:
short,unsigned(无符号),_Bool,_Complex,_Imaginary运算符--->
sizeof()函数--->
scanf()处理用户输入流整数类型和浮点数类型的区别
示例代码:
# include<stdio.h>
int main(void)
{
float weight; // 体重
float value; // 等体重白金价值
printf("请输入你的体重:\n");
/* 调用scanf()函数处理用户输入的数据 */
scanf("%f", &weight); // 占位符%f表示读取用户从键盘输入的浮点数,&表示寻找变量的地址
getchar(); // 读取换行符
value = 1700.0 * weight * 14.5833;
printf("体总换算出来的白金价值是:$%.2f\n", value); // %.2f表示输出小数点后两位数
getchar(); // 退出程序
return 0;
}
数据类型关键字
计算机的存储方式大致可分为两种:
- 整数类型
- 浮点数类型
在了解存储方式之前需要了解位、字节、字:(三者是描述计算机存储单元的术语)
位(bit):最小的存储单元,可以存储0或1,是计算机内存的基本构建块字节(byte):常用的计算机存储单元,1字节为8位,这是字节的标准定义--->由于1位可以表示0或者1,那么8位就有2^8次方组合,可以表示256种组合,所以1字节便可以存储0~255的整数或者字符字:设计计算机时给定的自然存储单位,最初的微型计算机1字只有8位,后来发展有了16位,32位,到现在的64位,计算机的字长越大,数据转移越快,允许的内存访问也越多
整数类型
整数类型的存储特点:
- 计算机以二进制存储整数
示例:
例如存储7这个数,计算机会把7转为二进制111,然后以一个字节存储,那么一个字节是8位,前五位设置成0,后三位设置成1这样一个7就存储好了
浮点数类型
浮点数类型的存储特点:
- 计算机把浮点数分成小数部分和指数部分来表示
- 小数部分和指数部分是分开存储的
- 由于在任何区间内(
1.0~2.0之间)都存在无穷多个实数,所以计算机的浮点数不能表示区间内的所有值,浮点数通常只是实际值的近似值(如7.0近似值为6.99999),所以浮点数的算术运算会损失更多的精度
变量的声明和赋值
特点:
- 声明操作为变量创建和标记内存空间
- 赋值操作为变量指定初始值
不同进制
不同进制的显示:
- 十进制整数:
%d--->显示前缀:%d - 八进制整数:
%o--->显示前缀:%#xo - 十六进制整数:
%x--->显示前缀:%#x
整数溢出:
示例代码:
# include<stdio.h>
int main(void)
{
/* 声明一个整数,该整数大于计算机最大的整数存储范围 */
int i = 2147483647;
/* 声明一个非负整数,也是大于计算机最大的非负整数存储范围 */
unsigned int j = 4294967295;
// 打印上述两个数观察结果
printf("%d, %d, %d", i, i+1, i+2);
printf("%u, %u, %u", j, j+1, j+2); // %u是非负整数的占位符, 打印long类型整数就用%ld
getchar();
return 0;
}
小结:
- 无符号整数,超过表示的最大值时,重新从起始点开始表示(0,1)
- 有符号整数,超过表示的最大值时,从
-2147483648开始表示
short,long,long long,unsigned的表示:
示例代码:
# include<stdio.h>
int main(void)
{
unsigned int un = 3000000000; // int 为32位和short为16位的系统
short end = 200;
long big = 65537;
long long veryBig = 12345678908642;
// 打印这些数
printf("un = %u, 不是: %d\n", un, un); // 无符号的un用%d表示会得到负值,因为un的表示和-129496296表示相同,如果告诉pringtf打印无符号是正值,如果是有符号会是另一个值
printf("end = %hd, 也可以是: %d\n", end, end); // %hd表示short的占位符,如果操作系统位数不同的话可以用%d表示,long也是如此
printf("big = %ld, 不是: %hd\n", big, big); // long类型的占位符用%ld表示
printf("veryBig = %lld, 不是: %ld\n", veryBig, veryBig);
getchar();
return 0;
}
打印字符:
# include<stdio.h>
int main(void)
{
// 声明一个字符,同时使用字符打印和十进制整数打印,观察字符在内存当中的存储方式
char ch;
printf("输入你希望打印的字符:\n");
scanf("%c", &ch); // 字符的占位符是%c
getchar();
printf("字符%c的十进制表示数是:%d", ch, ch);
getchar();
return 0;
}
小结:
-
字符
C会根据其对应的编码转为int类型数据,存入一字节的存储空间中(8位) -
printf()函数中的转换决定了数据的显示方式而不是数据的存储方式 -
有些编译器把
char定义为有符号,存储范围是-128~127.有些编译器把char定义为无符号,存储范围是0~255,编译器具体把char定义为什么样子可以查询编译器手册,或者在limits.h头文件中查看
显示可移植类型:
# include<stdio.h>
# include<inttypes.h> // 支持可移植类型
int main(void)
{
/* 声明一个32位有符号的整型变量 */
int32_t me32;
me32 = 45933945;
printf("常规输出int32类型:\n");
printf("me32 = %d\n", me32);
// 使用字符串宏显示可移植类型
printf("me32 = %" PRId32 "\n", me32); // C可以把多个连续的字符串组合成一个字符串
// 在inttypes.h宏文件中把`PRID32`定义为了字符"d"
// 所以上述输出等价于printf("me32 = %d\n", me32);
getchar();
return 0;
}
float、double、long double
float
特点:
float类型必须至少能表示6位有效数字,取值范围至少是10^-37~10^37- 存储一个
float类型数据占位32位,8位表示指数值或符号,24位表示非指数部分
double(双精度)
特点:
- 至少表示
10位有效数字 double占用64位
long double
特点:
- 至少与
double类型的精度相同
特殊示例:
如果编译器假定浮点型常量是double类型的精度,那么4.0和2.0被存储为64位的double类型,使用双精度进行乘法运算,乘积会被截断成float类型的宽度.(计算精度更高,但是速度更慢)
打印浮点数示例代码:
# include<stdio.h>
int main(void)
{
float aboat = 32000.0;
double abet = 2.1439; // 科学计数法
long double dip = 5.32e-5;
printf("%f 能被写成: %e\n", aboat, aboat);
printf("%a ...\n", aboat);
printf("%f 能被写成: %e\n", abet, abet);
printf("%Lf 能被写成: %Le\n", dip, dip);
getchar();
return 0;
}
浮点数舍入错误示例代码:
# include<stdio.h>
int main(void)
{
float a, b;
b = 2.0e220 + 1.0;
a = b - 2.0e20;
printf("a = %f\n", a);
getchar();
return 0;
}
浮点数舍入错误原因小结:
计算机缺少足够的小数位来完成正确的当前运算
float类型存储6~7位有效数字,2.0e20表示2后面有20个0,把该数+1发生变化的在第21位,所以必然会计算错误
内置运算符sizeof:
作用:
- 以字节为单位返回指定类型的大小
- 占位符是
%zd
刷新输出:
printf()语句把输出发送到一个缓冲区,缓冲区中的内容在被不断地发送到屏幕上.
缓冲区发送的条件:
- 当缓冲区满
- 遇到换行字符或需要输入的时候

浙公网安备 33010602011771号