推荐浙大的MOOC网课,C语言程序设计 翁凯老师 编程软件使用的是Dev-C++,如果你不能翻墙下载的话,可以考虑其它
C语言的变量必须在使用前定义,并确定类型。不同的数据类型在内存中所占空间不同。
常用的数据类型:
整数:char,short,int,long,long long
浮点数:float, double,long double
逻辑(0,1):bool
Part 1整数类型
在赋值变量时,为了不发生溢出,就要了解一下每种数据类型表示的范围。
1.char
当然char也可以是字符类型,这里讨论整数类型。
char | 1字节 8位 |
---|
char能表示的数的范围是-128到-1, 0到127
unsigned char 能表示的范围是0到255
由于补码存储,有一个有趣的现象:就是127+1=-128,-128-1=127,这图还是可以的吧,哈哈哈哈哈哈
#include<stdio.h>
int main()
{
char a=-128-1;
//1个字节 11111111=-1 10000000=-128
//00000000=0 01111111=127
//unsigned char 00000000-11111111 0-255
printf("%d %d",a,b,sizeof(char));
return 0;
}
结果就是:
你可以自己试试。sizeof可以直接读到字节数。
2.int
对于int,我们用另一种方式算一下最大能表示多少吧。参见下面的程序:`
#include<stdio.h>
int main()
{
//得到int 能表示最大数
int a=0,b=0;
while(++a>0) ;
printf("the biggest number of type int is : %d\n",a-1);
b++;
while((a=a/10)!=0)
{
b++;
}
printf("the hightest layer of type int is :%d",b);
return 0;
}
/* %d int
%u unsigned
%ld long long
%lu unsigned long long */
当然这么机智的程序总是在我发明之前就有人写出来了,思想就是最大的整数+1会变成负数。
int 能表示的数与电脑内存大小有关,有的是4字节有的是8字节,取决于CPU和RAM直接最大传输位。我们平时定义不用多想,int is enough.
3.无符号数
平时还会涉及%u, unsigned int ,无符号数。还有补码的一个有趣的现象:
正数的补码和原码一样,该表示多大就多大,负数的开头都是1,具体转化…请自行查阅。
/* %d int
%u unsigned int
%ld long long
%lu unsigned long long
%e 科学计数法*/
#include<stdio.h>
int main()
{
char c=-1;
int d=-1;
printf("c=%u,d=%u",c,d);
//在这一步不是unsigned int 格式的会被扩展为unsigned int
//char -1第一位是1,扩展后和int一样
}
4.有效数字
关于有效数字和科学计数法:
include<stdio.h>
int main()
{
double ff=1E-10;
printf("%E,%.16f\n",ff,ff);
}
//int 有效数字7
//double 有效数字15
//double 有时无法准确表达一个数字,0.0049 这是天生的
//double 会四舍五入 0.005 %.2f 0.01
%.16f 使结果展示出16位
整数内容就到这里。
Part 2浮点数类型
float | 4字节 7位有效数字 |
---|---|
double | 8字节 15位有效数字 |
涉及到inf,无穷大
nan 表示不存在的数
scanf一个double的数的时候一定是%lf
浮点数运算总是有一定误差,有一个误差范围。
#include<stdio.h>
int main()
{
float a,b,c;
a=1.345f;
b=1.123f;//用f表明身份,带小数点的字面量是double
c=a+b;
if (c==2.468)
printf("相等!\n");
else
printf("不相等!%.10f,%f\n",c,c);
//%f有进位操作,有效7位
if (fabs(c-2.468)<(1e-3))
printf("误差小于1e-3!\n");
else
printf("误差大于1e-3!\n");//1e-8 1e-12就差不多相等了
}
Part3 字符配型
对于char,%c表示输出字符,%d输出ASCII码
#include<stdio.h>
int main()
{
char c;
char d;
scanf("%c",&c);
printf("c='%c'\n",c);
printf("c=%d\n",c);
return 0;
}
A+‘a’-'A’可以把小写字母变成大写
a+‘A’-'a’可以把大写字母变成小写