英语:
Byte:字节
Word:字,4字节
Half Word:半字,2字节
Double Word:双字,8字节
//Half Half Word:半半字,1字节
rollback:回滚:从哪里来滚回哪里去
回顾:
1.linux系统的命令
clear/ pwd/ cd/ ls - lh/ touch/ mkdir -p/ rm -fr/cp -fr/ mv -fr/ cat/
echco 配合>, >>/ find/ grep/ whoami/ tar/
2.vim编译器
vim三种模式
模式切换
命令行模式的命令
可视模式的快捷键
3.C语言编程规范
文件
源文件.c
头文件.h
注释
/* */ 多行,不能嵌套
// 可以嵌套,不能多行
主函数main
int main(void){
...
}
printf
标准C库函数:大神写好的,直接使用
添加stdio.h头文件
printf("输出信息"):光标还在本行停留
printf("输出信息\n");光标会跑到下一行
占位符:printf("输出信息%d\n",数字或者变量);
4.gcc编译器
翻译官:源文件->可执行文件
翻译三步骤:
预处理:gcc -E -o xxx.i xxx.c
只编译不链接:gcc -c -o xxx.o xxx.i
链接:gcc -o xxx xxx.o
编译的三种方式:
流氓法,分步法,一步到位
5.C语言的变量
概念:
内存:程序最终玩内存
字节:Byte
地址:Address
存储区:Buffer
首地址:base address
切记:1.只要知道了内存地址,就可以对内存进行读数据或者写数据
2.要想访问内存,必须提前分配获取到你内存,不能不分配直接访问,否则程序崩溃
Q:如何分配内存呢?
A:通过定义变量
a)定义变量语法:
数据类型 变量名 = 初始值;
例如:int a = 250; 此时此刻脑子务必浮现一个内存示意图
后续可以通过 "=" 给变量赋值(本质就是修改内存里面的数字)
如果不初始化,也就是不给初始值,gcc编译器会给一个随机乱七八糟的数
b)标识符命名规则
c)C语言基本编程风格
---------------------------------------------------------------------------------------------------------------
d)详解定义变量时的数据类型
1.数据类型功能:让gcc编译器预算出将来这个变量要分配的内存大小
2.12类基本数据类型如下:
关键字名称 含义 分配内存大小 包含数字的范围
char 字符类型(本质是单字节整数) 1字节 -128 ~ 127
unsigned char 非负单字节整数 1字节 0~255
short 双字节整数 2字节 32768 ~ 32767
unsigned short 非负双字节整数 2字节 0 ~ 65535
int 四字节整数 4字节 -2^31 ~ 2^31-1
unsigned int 非负四字节整数 4字节 0 ~ 2^32-1
long 四字节(32位)八字节(64位)整数 4/8字节 -2^63 ~ 2^63-1
unsigned long 非负四字节(32位)八字节(64位)整数 4/8字节 0 ~ 2^64-1
long long 八字节整数 8字节 略(过大)
unsigned long long 非负八字节整数 8字节 略
float 单精度浮点数 4字节 略
double 双精度浮点数 8字节 略
应用:
char a = 1; //分配1字节内存
short a = 1; //分配2字节内存
unsigned int a //分配4字节内存
long a = 1; //分配4字节/8字节内存
unsigned long long a = 1; //分配8字节内存
double a = 1.1; //分配8字节内部才能
3.切记:unsigned int 和unsigned long对于gcc编译器来说不一样:
对于32位系统/64位系统,usigned int 都是4字节
对于32位系统,unsigned long 同样是4字节
对于64位系统,unsigned long 是8字节
将来后续课程讲指针高级用法,用得着!
4.每种数据类型都有 有符号和无符号
1.有符号数字有正负之分,无需添加关键字unsigned,但是可以加或者不加signed关键字
例如:int a = -10; 等价于 signed int a = -10;
2.无符号数字(非负)只有0和正数,必须添加unsigned关键字
例如:unsigned int a = 10;
e)利用sizeof关键字可以获取变量或者数据类型将来分配的内存大小
语法:内存大小 = sizeof(变量名或者数据类型关键字名);
例如:
long long a = 1;
printf("%d %d\n",sizeof(a),sizeof(long long));
切记:sizeof圆括号里面如果对变量进行修改赋值操作,此操作是无效的
案例:利用sizeof求变量或者数据类型分配内存大小
实施步骤:
mkdir /home/tarena/stdc/day03
cd /home/tarena/stdc/day03
vim sizeof.c
gcc -o sizeof sizeof.c
./sizeof
//参考代码
/*sizeof演示*/
#include <stdio.h>
int main(void){
char a = 1;
unsigned char b = 2;
printf("sizeof(a) = %d,sizeof(char) = %d\n",sizeof(a),sizeof(char));
printf("sizeof(b) = %d,sizeof(unsigned char) = %d\n",sizeof(b),sizeof(unsigned char));
short c = 3;
unsigned short d = 4;
printf("sizeof(c) = %d,sizeof(short) = %d\n",sizeof(c),sizeof(short));
printf("sizeof(d) = %d,sizeof(unsigned short) = %d\n",sizeof(d),sizeof(unsigned short));
int e = 5;
unsigned int f = 6;
printf("sizeof(e) = %d,sizeof(int) = %d\n",sizeof(e),sizeof(int));
printf("sizeof(f) = %d,sizeof(unsigned int) = %d\n",sizeof(f),sizeof(unsigned int));
double g = 1.1;
printf("sizeof(g) = %lf,sizeof(double) = %lf\n",sizeof(g),sizeof(double));
//自行添加:long/unsigned long, long long/unsigned long long, float
//以下操作无法修改变量值
int i = 250;
sizeof(i = 300);
printf("i = %d\n",i);
return 0;
}
f)细说基本数据类型只字符类型char
1.字符常量概念:用单引号括起来表示,其值固定不变,不可修改
例如:'A', 'a', '1'等
2.字符常量(用char或者unsigned char 定义的变量)存储的数据本质
就是一个字符常量对应的整数,这个整数专业术语叫ASCII码
例如:
char a = 'A'; //表面看是分配1字节内存,并且里面放了一个字符常量'A'
这样理解是错误的!
本质是分配1字节内存空间,并且内存里面放了一个字符常量'A'
的ASCII码65(就是一个整数)
ASCII码和字符常量的对应关系:
给人看的 给计算机看的
类似中文你好 类似英文hello
字符常量 ASCII码
'A' 65
'B' 66
...
'a' 97
'b' 98
...
'1' 49
'2' 50
所以:'d' - 'a' = 本质是100 - 97 = 3
3.字符变量打印输出的占位符:%c(按字符常量形式显示)和%d(按整数ASCII码形式显示)
例如:
char = 'A';
printf("%c,%d\n",a,a); //A,65
案例:演练字符类型
参考代码:char.c
4.转义字符
'\n':让光标移动到下一行的行首
'\r':让光标移动到当前行的行首
'\t':输出一个TAB键
'\\':得到一个\
'\'':得到一个'
'\"':得到一个"
'%%':得到一个%%
案例:利用printf输出以下信息
abc
def\efg'mn"ijk%
代码参考:printf("abc\n\tdef\\efg\'mn\"ijk%%\n");
g)细说基本数据类型之整数类型
1.整形数据类型的关键字:int
可以用short,unsigned short,long,unsigned long进行修饰
所以int可以代表2字节或者4字节
2.int类型的六种形式:
形式1:short(int):分配2字节,有符号
short a = 250;
等价于
short int a = 250;
形式2:unsigned short (int);分配2字节,无符号
unsigned short a = 250;
等价于
unsigned short int a = 250;
形式3:long(int):分配4字节,有符号
long a = 250;
等价于
long int a = 250;
形式4:unsigned long(int ):分配4字节,无符号
unsigned long a = 250;
等价于
unsigned long int a = 250;
形式5:int:分配4字节,有符号
int a = 250;
形式6:unsigned int:分配4字节,无符号
unsigned int a = 250;
3.整数常数(高手)
100:gcc编译器默认当成int类型
100L:gcc编译器默认当成long类型
100LL:gcc编译器默认当成long long类型
100u:gcc编译器默认当成unsigned类型
100UL:gcc编译器默认当成unsigned long类型
Q:虽然类型不一样,都是数值100的常数,有何用?
A:这个知识点将来用于数据类型之间的转换使用,后续课程再使用!
h)细说浮点数:float和double
1.23:gcc编译器把它当double类型
1.23f:gcc编译器把它当float类型
注意:浮点数在计算机中是一个无限趋近的近似值
例如:1.230000001是无限趋近1.23的值
i)数据类型的对应的占位符(给printf函数使用)
数据类型 占位符
int %d
char %c,%hhd
unsigned char %c,%hhu
short %hd
unsigned short %hu
int %d
unsigned int %u
long %ld
unsigned long %lu
long long %lld
unsigned long long %llu
float %f或者%g
double %lf或者%lg
注意:前者保留多余的0,后者不会保留
例如:2.3 ---> %f/%lf ---> 2.300000
2.3 ---> %g/%lg ---> 2.3
参考代码:vim type.c
/*数据类型和占位符演示*/
#include <stdio.h>
int main(void){
char a = 97;'
unsigned b = 'A';
printf("%c,%hhd\n",a,a);
printf("%c,%hhu\n",b,b);
short c = 250;
unsigned short d = 251;
printf("%hd,%hu\n",c,d);
int e = 252;
unsigned int f = 253;
printf("%d,%u\n",e,f);
long g = 254;
unsigned long h = 255;
printf("%ld,%lu\n",g,h);
float i = 2.3;
double j = 3.2;
printf("%f,%lf\n",i,j);
printf("%g,%lg\n",i,j);
return 0;
}
注意:回滚现象,参考代码:type2.c
代码演示:
#include <stdio.h>
int main(void){
//char:-128~127
printf("%hhd\n",~128);
printf("%hhd\n",127);
printf("%hhd\n",128); //回滚到-128
printf("%hhd\n",129); //回滚到-127
printf("%hhd\n",255); //回滚到-1
printf("%d\n",255); //正常,不会回滚
//unsigned char:0~255
printf("%hhu\n",255);
printf("%hhu\n",256); //回滚到0
printf("%d\n",256); //正常,不会回滚
return 0;
}
------------------------------------------------------------------------------------------
第四课:进制转换
1.明确:计算机中数字都是在内存中进行存储,并且这些数字都是以二进制的形式存储
2.明确:计算机软件代码中数字的表示形式(展现形式)有四种:
二进制表示,八进制表示,十进制表示,十六进制表示
注意:不管是哪种形式,都是对同一个内存中存储的数字的不通表示形式而已
内存中的数字不会因为表示形式不一样而数字发生改变
也就是内存中数字的值不会随着进制的改变而改变,内存中都是二进制形式!
类比:人(数字)
在家(二进制形式)
在公司(十进制形式)
在超市(十六进制形式)
人不管在哪里,本身是不会改变的!
八进制,十进制,十六进制给程序员看的,好看
二进制给计算机看,计算机只认二进制
3.明确:计算机把内存中每个字节又分8段,每段只能记录0和1
要想把一个数字存储到内存中,必须将这个数字分拆成若干个0和1存储到每个段中
每段对应的专业术语叫bit或者bit位
内存中的最小存储单元是为(bit)
结论:1Byte = 8bit
2Byte = 16bit
4Byte = 32bit
8Byte = 64bit
例如:char a = 'A'; //分配1字节内存空间,把字符A的ASCII码65分拆成8个0和1(需要8位)存储到内存中即可
short a = 250; //分配2字节内存空间,把250分拆成16个0和1(需要16位)存储到内存中即可
int a = 250; //分配4字节内存空间,把250分拆成32个0和1(需要32位)存储到内存中即可
4.二进制
a)定义:用一组0和1表示数字的方法简称二进制表示形式
例如:现在有一个十进制数85(前提是char类型),要存储到内存中,必须以二进制的形式存储
所以需要将85分拆成8个0和1,最终其二进制表示形式为:01010101(二进制形式)
b)特点:
1.二进制数的编号:从0开始
例如:前提是char类型(需要1字节)
高位 低位
76543210 二进制数的编号
01010101 二进制数
例如:前提是char类型(需要2字节)
高位 低位
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 二进制数编号
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 二进制数
2.二进制数中每个1单独代表一个10进制数字,这个10进制数字值是2的编号次方
例如:前提是char类型