达内嵌入式课程笔记
day3: C语言数据类型 、 变量的输入和输出
STDC01_day03_01-C语言数据类型01.ts
字符类型名称char
字符类型里包含256个不同的整数,每个整数可以用来代表一个字符(例如’a’,’^'等)
这些整数和字符可以互相替代
ASCII码表中列出所有整数和字符的对应关系
'a' 97
'A' 65
'0' 48
ASCII码表里所有小写英文字母是连续排列的,并且’a’对应的整数最小,字母’z’对应的整数最大
ASCII码表里所有大写英文字母和阿拉伯数字字符也都符合这个规律
'd' - 'a' 等于 'D' - 'A'
'd' - 'a' 等于 '3' - '0' 等于 3 - 0
字符类型里的所有字符被分成两组,每组包含128个
其中一组字符和整数之间的对应关系在所有计算机上都一样,它们对应的整数范围从0开始到127为止
另外一组字符和整数之间的对应关系在不同的计算机上可能不同,它们对应的整数有可能从-128到-1,也有可能从128到255
'\n' 换行字符(newline) 使光标下移一格
'\r' 回车字符(return) 使光标到行首
/CSD1702/biaoc/day03 01char.c
/*
字符演示
*/
#include <stdio.h>
int main(){
printf("abc\nde\n"
printf("abc\rde\r");
return 0;
}
结果:
abc
de
dec
特殊字符输入方法
'\'' 代表字符'
'\"' 代表字符"
'\\' 代表字符\
短整数类型名称是short
(2个字节)
这个类型里包含65536个不同的整数,其中一半是非负数,另外一半是负数。这些数字以数字0为中心向两边扩展
长整数类型名称是long
(32位系统4个字节,64位系统8个字节)
这个类型里包含2的32次方个不同的整数,其中一半是非负数,另外一半是负数。这些数字以数字0为中心向两边扩展的。
整数类型名称是int
在我们的计算机上整数类型和长整数类型完全一样
以上类型统一叫做有符号类型
每个有符号类型有一个对应的无符号类型,无符号类型的名称是在对应的有符号类型名称前加unsigned
(例如unsigned char
,unsigned int
等)
STDC01_day03_02-C语言数据类型02.ts
无符号类型和它对应的有符号类型所包含的整数个数一样,但是不包含负数
整数相关类型所包含的数字范围互相重叠并且逐渐扩大
程序中不带小数点的数字后加u
表示数字的类型是无符号整数类型
C语言程序中使用浮点类型表示带小数点的数字
浮点类型分为单精度浮点类型和双精度浮点类型
双精度浮点类型可以记录更多小数点后面的数位
单精度浮点类型的名称是float
双精度浮点类型的名称是double
程序中带小数点的数字默认是双精度浮点类型的
如果带小数点的数字后加f
就表示这个数字的类型是单精度浮点类型
STDC01_day03_03-C语言数据类型03.ts
C语言里允许程序员扩展新的数据类型
这些新的数据类型叫复合数据类型
复合数据类型需要先创建然后才能使用
C99规范里引入布尔类型
这个类型里只包含0和1两个整数,0叫做假,1叫做真
真和假都叫做布尔值
任何一个整数都可以当作布尔值使用,0当作布尔值使用的时候是假,其他整数当作布尔值使用的时候都是真
数据类型和占位符的对应关系
char和unsigned char %c
short %hd
unsigned short %hu
long %ld
unsigned long %lu
int %d //将内存中二进制存的数字以int型显示出来
unsigned int %u //将内存中二进制存的数字以unsigned int型显示出来
float %f或%g
double %f或%lg
%f
和%lf
会保留小数点后面多余的0,%g和%lg不会保留
/CSD1702/biaoc/day03 02char.c
/*
占位符演示
*/
#include <stdio.h>
int main(){
printf("%f %g\n",5.2f,5.2f);
return 0;
}
结果:5.200000 5.2
STDC01_day03_04-C语言数据类型04.ts
不同数据类型的一个重要区别就是不同类型的存储区包含的字节个数不同
sizeof
关键字可以用来计算一个存储区包含的字节个数
/CSD1702/biaoc/day03 03sizeof.c
/*
sizeof关键字演示
*/
#include <stdio.h>
int main(){
int num = 0;
printf("sizeof(num)是%d\n",sizeof(num));
printf("sizeof(int)是%d\n",sizeof(int));
printf("sizeof(2 + 5)是%d\n",sizeof(2 + 5));
return 0;
}
结果:
sizeof(num)是4
sizeof(int)是4
sizeof(2 + 5)是4
char
和unsigned char
1个字节
short
和unsigned short
2个字节
int
和unsigned int
4个字节
long
和unsigned long
4个字节
float
4个字节
double
8个字节
sizeof
小括号里可以写任何能当作数字使用的内容
/CSD1702/biaoc/day03 03sizeof.c
/*
sizeof关键字演示
*/
#include <stdio.h>
int main(){
int num = 0;
printf("sizeof(num)是%d\n",sizeof(num));
printf("sizeof(int)是%d\n",sizeof(int));
printf("sizeof(2 + 5)是%d\n",sizeof(2 + 5));
sizeof(num = 10); //num = 10没有执行 num还是0
printf("num是%d\n",num);
return 0;
}
结果:
sizeof(num)是4
sizeof(int)是4
sizeof(2 + 5)是4
num是0
sizeof
小括号里对任何存储区内容的修改不会真正生效
STDC01_day03_05-变量的输入和输出01.ts
scanf
标准函数可以把用户在键盘上输入的数字记录到变量的存储区里
为了使用这个标准函数需要包含stdio.h
头文件
/CSD1702/biaoc/day03 04scanf.c
/*
scanf标准函数演示
*/
#include <stdio.h>
int main(){
int num = 0;
scanf("%d",&num);
printf("num是%d\n",num);
return 0;
}
输入:4.2按回车健
结果:num是4
scanf
函数调用语句里需要使用存储区的地址表示存储区
双引号里使用占位符表示存储区的类型
/CSD1702/biaoc/day03 04scanf.c
/*
scanf标准函数演示
*/
#include <stdio.h>
int main(){
int num = 0;
printf("请输入一个数字:");
scanf("%d",&num);
printf("num是%d\n",num);
return 0;
}
输入:6.9按回车健
结果:num是6
/CSD1702/biaoc/day03 04scanf.c
/*
scanf标准函数演示
*/
#include <stdio.h>
int main(){
int num = 0;
printf("请输入一个数字:");
scanf("ab%d",&num);
printf("num是%d\n",num);
return 0;
}
输入:45按回车健
结果:没有结果
输入:ab34按回车健
结果:num是ab34
不要在scanf
函数调用语句的双引号里写不是占位符的内容
STDC01_day03_06-变量的输入和输出02.ts
可以在一条scanf
函数调用语句里获得多个数字
/CSD1702/biaoc/day03 04scanf.c
/*
scanf标准函数演示
*/
#include <stdio.h>
int main(){
int num = 0,num1 = 0;
printf("请输入两个数字:");
scanf("%d%d",&num,&num1);
printf("num是%d\n",num);
printf("num1是%d\n",num1);
return 0;
}
结果:
请输入两个数字:34 87 (两个数字间可以用空格或回车分开)
num是34
num1是87
如果用户输入的格式和程序中要求的格式不同就无法获得数字
练习:
编写程序从键盘得到一个浮点数作为圆的半径,计算圆的周长并把结果显示在屏幕上
根据半径计算周长的公式是
2 * 3.14 * 半径
/CSD1702/biaoc/day03 05circle.c
/*
变量练习
*/
#include <stdio.h>
int main(){
float radius = 0.0f;
printf("请输入半径:");
scanf("%g",&radius);
printf("周长是%g\n",2 * 3.14f * radius);
return 0;
}
结果:
请输入半径:5.2
结果:
周长是32.656
STDC01_day03_07-进制转换01.ts
一个字节可以分成八段,每段可以用来记录一个0或者1
要想把一个数字记录到一个字节里就必须首先把它拆分成8个0或者1
采用一组0或者1表示数字的方法叫二进制
任何数字既可以采用二进制方式表示也可以采用十进制方式表示
计算机里只能记录二进制方式表示的数字
二进制表示方式中每个数位有一个有一个编号,最右边数位的编号是0,向左依次递增
二进制表示方式中某个数位里的1单独代表一个数字,这个数字就是2的数位编号次方
二进制表示方式中如果两个相邻数位的内容一样则左边数位代表的数字是右边数位代表数字的2倍
用二进制表示的非负数符合以上规则
二进制加一的时候把数位0开始的连续多个1都变成0,把最右边的0变成1
STDC01_day03_08-进制转换02.ts
二进制表示的非负数转换成十进制的时候只需要把每个数位里的内容单独转换然后再求和
0000 0101 = 2的2次方 + 2的0次方
= 4 + 1
= 5
0010 1100 = 2的5次方 + 2的3次方 + 2的2次方
= 32 + 8 + 4
= 44
十进制表示的非负数转换成二进制的方法
12 *******0
6 ******0
3 *****1
1 ****1
0 ****
转换结果是0000 1100
不断对原始数字进行除以2保留整数部分的操作得到一组数字,用其中每个数字除以2取余得到一个数位的内容,把所有数位的内容按照从后向前的顺序书写就得到转换结果
STDC01_day03_09-进制转换03.ts
负数的二进制和十进制之间不能直接转换,需要借助相反数
转换过程分三步:
1.首先根据原始数字得到相反数
2.把第一步得到的相反数进行转换
3.根据第二步的转换结果再计算相反数
把二进制表示方式中每个数位的内容变成相反内容然后再加一就得到相反数的二进制
0110 1101 (109的二进制)
1001 0010 + 1 = 1001 0011 (-109的二进制)
0110 1100 + 1 = 0110 1101 (109的二进制)
-14
STDC01_day03_10-进制转换04.ts
-14
14
0000 1110 (14的二进制)
1111 0001 + 1 =1111 0010 (-14的二进制)
有符号类型数字最左边的二进制数位可以帮助判断数字的符号,这个数位叫做符号位
符号位是0表示数字是非负数,符号位是1表示数字是负数
1100 0101 (负数)
0011 1010 + 1 = 0011 1011 (得到相反数)
59
-59
STDC01_day03_11-进制转换05.ts
/CSD1702/biaoc/day03 06bit.c
/*
二进制演示
*/
#include <stdio.h>
int main(){
char ch = 300;
int num = ch;
printf("num是%d\n",num);
return 0;
}
结果:
num是44
300的二进制是
0000 0000
0000 0000
0000 0001
0010 1100
ch是字符类型,只能保存一个字节
0010 1100
num是整数类型,可以保存四个字节
0000 0000
0000 0000
0000 0000
0010 1100
/CSD1702/biaoc/day03 06bit.c
/*
二进制演示
*/
#include <stdio.h>
int main(){
char ch = 300;
int num = ch;
printf("num是%d\n",num);
ch = 128;
num = ch;
printf("num是%d\n",num);
return 0;
}
结果:
num是44
num是-128
128在内存中的二进制
0000 0000
0000 0000
0000 0000
1000 0000
将128赋值给字符变量时 字符型变量有符号位
1000 0000
赋值给整数类型时填充符号位1
1111 1111
1111 1111
1111 1111
1000 0000
所以num是-128
练习:
编写程序从键盘得到一个0到127之间的整数,把它转换成二进制并把结果显示在屏幕上
八个二进制数位就够了
基础知识: 15 / 6 = 2
15 % 6 = 3
/CSD1702/biaoc/day03 07bit.c
/*
二进制练习
*/
#include <stdio.h>
int main(){
int num = 0;
printf("请输入一个数字:");
scanf("%d",&num);
printf(" %d\r",num % 2);
num = num / 2;
printf(" %d\r",num % 2);
num = num / 2;
printf(" %d\r",num % 2);
num = num / 2;
printf(" %d\r",num % 2);
num = num / 2;
printf(" %d\r",num % 2);
num = num / 2;
printf(" %d\r",num % 2);
num = num / 2;
printf(" %d\r",num % 2);
num = num / 2;
printf("%d\n",num % 2);
return 0;
}
预习:
1.八进制和十六进制
2.操作符