1、进制
1.1、十进制,八进制,二进制,十六进制
十进制:逢10进1,由0~9的数字组成,比如:123,456,789
八进制:逢8进1,由0~7的数字组成,以0开头,比如:0123,0456,07
二进制:逢2进1,由0和1组成,比如:111101,1001101
十六进制:逢16进1,由0~9,a~f,以0x开头,比如:0x12345,0x425
1.2、进制之间的转换
十进制转八进制,二进制,十六进制
最简单:除以进制数,取余,逆序输出即可
二进制转八进制,十六进制
二进制转八进制,每三个位为一位八进制,按照位权相加即可
二进制转十六进制,每四个位为一位十六进制,按照位权相加即可
二进制,八进制,十六进制转十进制
二进制转十进制,二进制的每一位的位权相乘在相加
八进制转十进制,八进制的每一位的位权相乘在相加
十六进制转十进制,十六进制的每一位的位权相乘在相加
2、数据在内存中的存储
1Byte = 8bit
1字节=8比特
1KB = 1024Byte = 2^10Byte
1MB = 2^10KB
1GB = 2^10Mb
1TB = 2^10GB
3、ASCII码
字符在程序里面以ASCII码的方式存在的
#include <stdio.h> int main(int argc, char const *argv[]) { char c = 'a'; printf("c = %d\n", c); return 0; } 输出结果:c = 97
我们需要记住的ASCII码
'a' 97
'A' 65
'0' 48
space 32
4、基本数据类型
4.1、基本类型
数值类型 | 整型 | int | 整型 |
long | 长整型 | ||
short | 短整型 | ||
浮点型 | float | 单精度浮点型 | |
double | 双精度浮点型 | ||
字符类型 | 字符型 | char | 字符型 |
4.2、构造类型
数组 | |
struct | 结构体(组合数据类型) |
union | 联合体(共用体) |
enum | 枚举 |
4.3、指针类型
4.4、void类型(空类型)
数据类型所占字节大小
类型/编译器 | 16位编译器 | 32位编译器 | 64位编译器 |
void | 0 | 0 | 0 |
char | 1 | 1 | 1 |
指针 | 2 | 4 | 8 |
short | 2 | 2 | 2 |
int | 2 | 4 | 4 |
long | 4 | 4 | 8 |
double | 8 | 8 | 8 |
float | 4 | 4 | 4 |
long long | 8 | 8 | 8 |
long double | 8 | 12 | 16 |
计算数据的取值范围根据字节转成多少个Bit,去算2的多少次方
记住不一样的三个(记少不记多)
类型/编译器 | 32位 | 64位 |
long | 4 | 8 |
指针 | 4 | 8 |
long double | 12 | 16 |
5、类型转换
C语言中所有的基本数据类型都是可以直接相互转换的。(隐式转换/默认转换)
注意:低精度转成高精度是没有任何问题的,高精度转成低精度,可能会发生数据丢失。
高精度:
double
float
int
short
char
低精度:
隐式转换:
int a; float f = 3.1415926; a = f; //这里会隐式转换,但是可能会发生数据丢失
printf("a = %d\n", a);
强制转换(建议少用):
(类型)变量名 int *d = malloc(sizeof(int));
double *p = (double *)d;
int *d,占用4个字节的空间,
double *p本身需要有8个字节的空间
p = d;用4字节空间初始化8字节空间,有4个字节没有做初始化的,去使用,非法访问,越界访问
6、变量和常量
6.1、变量
在使用过程中会发生改变的量,叫做变量
变量分为局部变量,全局变量,静态变量,只读变量
局部变量:用一对花括号扩起来的变量
全局变量:定义在函数外面的
静态变量:用一个叫做static的关键字修饰的变量
只读变量:用一个叫做const的关键字修饰的变量
6.2、常量
在使用过程中不会发生改变的量,叫做常量
整型常量:
十进制,八进制,二进制,十六进制
浮点型常量:
3.14 3.1415e+23.1415*10^2
字符型常量:用单引号引起来的
'a'
字符串常量:用双引号引起来的,末尾默认以'\0'作为结束符
"a" ""
注意:有一些字符是不能显示表达的,一般用转义字符,比如:回车 \n 制表符 \t
有些字符连转义字符都表达不了,用\xhh十六进制表示,跟\ddd八进制表示
\0不等于空格
6.3、const关键字
声明只读变量,只能读,不能改,一般在定义的时候需要做初始化
i
nt a = 100;
const int b = 200; a = 50;
b = 150;//不能赋值,因为b是只读变量
int c = a;
int d = b;
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
6.4、static关键字
修饰变量或者修饰函数,使它的生命周期发生改变
7、格式化输入输出
scanf用来输入,printf用来输出,它们两个叫做变参函数
#include <stdio.h>//格式化输入输出的头文件
输入:scanf extern int scanf (const char *__restrict __format, ...) __wur; scanf("%d", &n);//通过键盘输入一个整数,%d,格式控制符,通过n的地址,给到n scanf的第一个参数,双引号引起来的格式控制符里面,是怎么样的格式,就要按照什么样的格式来进行输入 如果有字符在做输入的时候,最好就在前面加一个清空输入缓冲区 while(getchar()!='\n'); fflush(stdin);
输出:printf extern int printf (const char *__restrict __format, ...); printf("n = %d\n", n);//通过显示屏将n打印出来 输出数据的时候,也有输出缓冲区,缓冲区是需要刷新才能看到的
1、加上'\n',用来刷新缓冲区
2、整个程序结束的时候
3、缓冲区满的时候
4、fflush(stdout);
5、后面加上scanf
格式控制符
整型 %d
长整型 %ld
短整型 %hd
短短整型(单字节整型) %hhd
无符号整型 %u
长无符号整型 %lu
单精度浮点型 %f
双精度浮点型 %lf
十六进制(大写) %X
十六进制(小写) %x
八进制 %o
字符型 %c
字符串 %s
科学计数法 %e
以十六进制表示地址 %p