字符类型名称是char
这个数据类型共包含256个不同的整数
每个整数代表一个字符(例如‘a’,’‘b’等)
这些字符和整数可以互相代替
ASCII码表里包含所有字符和整数之间的对应关系
‘a’ 97
‘A’ 65
‘0’ 48
‘d’-‘ a’等于‘D’ – ‘A’
‘d’ – ‘a’等于‘3’-‘0’ 等于3-0 (距离相等)
所有字符被分成两组,每组包含128个
其中一组字符和整数的对应关系在所有计算机上都一样,它们对应的整数范围从0—127
另外一组字符和整数的对应关系在不同计算机上可能不同,这些字符对应的整数可能从-128到-1,也可能从128到255
'\n' 换行字符
'\r' 回车字符,作用是所在行重写,\r后的内容将前面覆盖
1#include<stdio.h>
2int main(){
3 char a='c';
4 printf("abc\nde\n",a);
5 printf("abc\rde\n",a);
6 return 0;
7 }
输出: abc
de
dec (从头开始覆盖)
转义字符:
' \\ ' \字符
' \' ' '字符
' \" ' "字符
短整数类型是short
它里面包含65536个整数,其中一般是负数,另一半是非负数。以数字0向两边扩展 -32768--0----32767
长整数类型名称是long
它里面包含2的32次方个不同的整数,其中一般是负数,另一半是非负数。以数字0向两边扩展
整数类型名称是int
在我们计算机里的整数类型和长整数类型完全一样
每个有符号类型都有一个对应的无符号类型
无符号类型的名称就是在对应的有符号类型名称前加unsigned
无符号类型里只包含非负数,它们包含的数字个数和对应有符号类型包含的个数是一样的 范围是0--65535
以上数据类型包含的数字范围是互相重叠的
程序中不带小数点的数字后加u表示数字的类型是无符号整数类型
C语言使用浮点类型表示带小数的数字,分为两种类型:单精度类型和双精度类型
双精度浮点类型可以记录更多小数点后面的小数位
单精度浮点类型名称是float
双精度浮点类型名称是double
程序中带小数点的数字默认是双精度浮点类型
如果在带小数点的数字后加f表示数字类型是单精度浮点类型
C语言里可以扩展新的数据类型,这些扩展出来的数据类型叫做复合数据类型
复合数据类型需要先定义然后才能使用
布尔类型是C99规范中引入的数据类型,这个类型里只包含0和1两个整数,0叫做假,1叫做真。任何一个整数都可以当作布尔值使用,0当作布尔值使用时代表假,其他整数代表真,一般不需要使用布尔类型
数据类型和占位符的对应关系
char 和 unsigned char %c
short %hd
unsigned short %hu
long %ld
unsigned long %lu
int %d
unsigned int %u
float %f或%g
double %lf 或%lg
%f 和%lf 会保留小数点后无效的0,%g和%lg不会保留
练习:编写程序计算半径位5.2的周长,结果显示在屏幕上,2πr
1 #include<stdio.h>
2 int main(){
3 float r=5.2,l;
4 l=2*3.14*r;
5 printf("周长是: %g\n",l);
6 return 0;
7 }
不同类型存储区所包含的的字节个数不同 运算符
sizeof()关键字可以用来计算一个数据类型、存储区或数字在内存里占的字节个数
sizeof()是运算符,只用来结算
char 和unsigned char 1个字节
short 和unsigned short 2 个字节
int 和 unsignedint 4 个字节
long 和 unsigned long 4个字节
float 4个字节
double 8个字节
sizeof 关键字演示
1#include<stdio.h>
2 int main(){
3 short sum=0;
4 int a=1;
5 printf("%d",sizeof(int));
6 printf("%d",sizeof(short));
7 printf("%d",sizeof(a));
8 return 0;
9 }
输出结果:424
sizeof 后面小括号里如果修改了任何存储区的内容,则这种修改不会发生
int a=0; sizeof(a=10) ; 输出a的结果仍是0。
scanf标准函数可以从键盘得到用户输入的数字并记录到存储区里
使用这个标准函数需要包含stdio.h头文件
scanf函数调用语句里需要使用占位符表示存储区的类型scanf("%d",&a);
(&a 算出a的地址,往里面写入整数)
在scanf函数调用语句双引号里不要写不是占位符的内容scanf("%d\n",&a); 不好!
如果用户输入的数字格式和程序希望的格式不一致,可能影响后面获得的数字
编写程序从键盘得到半径,然后计算周长并显示结果:
1 #include<stdio.h>
2 int main(){
3 float r=0.0f,l=0.0f;
4 printf("请输入半径: ");
5 scanf("%f",&r);
6 l=2*3.14f*r;
7 printf("周长是%g \n",l);
8 return 0;
9 }
一个字节分成8位,每位是0或1.
若想把一个数字记录到一个字节里就必须首先把数字拆分成8个0或1.
采用一组0或1表示数字的方法叫做二进制
任何数字既可以采用十进制表示也可以采用二进制表示
计算机里只能记录用二进制表示的数字
二进制表示方式中每个数位有一个编号,最右边数位的编号是0,向左依次递增,某个数位上的1代表1个数字,这个数字就是数位的编号次方
二进制表示方式中如果两个相邻数位内容一样,则左边数位所代表的的数字是右边数位代表数字的2倍
用二进制表示的非负数符合以上规律
非负数十进制转换成二进制的方法:除2取余,再把余数从后向前书写
负数十进制和二进制之间不能互相转换,必须借助相反数
转换过程首先计算想法书,然后把结果进行转换,最后把转换结果再求相反数
二进制求相反数:把二进制中每个数位上的数字变成相反数字然后加一。
例:负数十进制转换二进制
-14
14
0000 1110
1111 0001+1 = 11110010
有符号类型数字的二进制中最左边的数位叫符号位,可以根据符号位知道数字的符号,如果符号位是0表示数字是非负数,如果符号位是1表示数字是负数
例:负数二进制转换成10进制
1100 0101
0011 1010+1=0011 1011
59
-59
内存溢出问题:当把占用字节大的整数相关类型数字复制给占用字节小的整数类型相关存储区时,只能保留字节小的字节数的最后二进制位,这可能导致数据内容发生变化
char a=300
int b=a;
printf(“%d”,b) 得出 44 因为字符型只有一个字节 整型有4个字节
把占用字节小的有符号整数相关类型赋值给占用字节大的有符号整数类型存储区的时候,扩展出来的二进制数位里填充的都是符号位
#include<stdio.h>
char ch=128;
int num=ch;
printf(“%d”,num) ; 结果是 -128
128是1000 0000
字符的数字大小最大只有127,所以溢出, 1000 0000,是负的二进制数 首先填充 成 4个字节
1111 1111 1000 0000 ,变成正的二进制数0000 0000 0111 1111 +1 = 0000 0000 1000 0000 变成十进制 128 变成负的 -128
编写程序从键盘得到一个0到127之间的整数,把这个整数转换成二进制,打印出来
1 #include<stdio.h>
2 int main(){
3 int num=0;
4 printf("please input number: 0-127\n");
5 scanf("%d",&num);
6 printf(" %d\r",num%2);
7 num=num/2;
8 printf(" %d\r",num%2);
9 num=num/2;
10 printf(" %d\r",num%2);
11 num=num/2;
12 printf(" %d\r",num%2);
13 num=num/2;
14 printf(" %d\r",num%2);
15 num=num/2;
16 printf(" %d\r",num%2);
17 num=num/2;
18 printf(" %d\r",num%2);
19 num=num/2;
20 printf("%d\n",num%2);
21 return 0;
22 }
输出结果 : 输入127 得到 0111 1111