进制转换:
- 为什么要二进制,八进制,十六进制?
因为cpu只能识别高低两种电流,所以只能对二进制数据进行运算。二进制虽然可以直接被cpu识别,但是不方便书写
所以把二进制转换为了八进制是为了方便记录在文件中。
随着cpu的不断发展不断地增加,由于八位计算机逐步发展到64位计算机,因此八进制逐渐不能满足需求,所以发展出
了十六进制,由于历史原因八进制还不能退出历史舞台(例如rwz1234)
- 十进制转换二进制,余二倒去或者加权
练习:
1.输入一个m在输入一个n进制,求n进制的m为多少?
输出的时候 ‘A’+n 来输出字符 不要用数组匹配
注意:二进制数据转换成八进制,十六进制是为了更方便的记录二进制数据。
熟练掌握2,8,10,16进制的任意转换
在c代码中:以0开头的数据都是八进制数据,以0x开头的都是十六进制数据
%o 是以八进制显示数据 %x 是以十六进制显示数据
%#o、%#x 以对应的进制显示数据,并加上开头前缀显示
源码、反码、补码:
- 源码:数据的二进制就是源码
正数:1-------0000 0001
负数:-1------1000 0001 最高位符号位
- 反码:
正数:1------0000 0001 正数源码=反码
负数:-1-----1111 1110 除了符号位不变,其余位按位取反;
- 补码:
正数:1------0000 0001 正数的补码就是它的源码
负数:-1------1111 1111 1.取到源码 2.取到反码 3.反码+1
-127 + -1 = 1000 0000补码 = -128
注意(%hd,0x81)和(%hhd,0x81)结果不同
补码转数据:
无符号的补码直接转成十进制
有符号的补码 最高位是0:说明是正数 直接转成十进制
最高位是1: 说明是负数
1.补码-1=反码
2.符号位不变,其余按位取反
3.源码转数据
注意:给出一个补码1111 1111 不说明类型
要分情况讨论!
类型:最大值+1 = 最小值
(char i =0;i<128;i++)
{
printf("%d",i);
}
死循环了
位运算符 & | ~ ^ << >>
&:按位与 有0出0 全1出1
|:按位或 有1出1 全0出0
~:取反
^:按位异或 不同出1 相同出0
A<<n : 把A的补码向左移动n位 右边补零 超出的丢弃
A>>n:把A的补码向右移动n位,右边丢弃,超出的补符号位
练习一:
练习二:输入一个整数,把它的4-7位 变成1010
例如 1100 1001 1110 —> 1100 1010 1110
(n & ~(0xf<<4))| (0xA<<4)
练习三:输入两个整数,把A的4-7位设置为B的3-6位
a & ~(0xf0) | (b<<1 & 0xf0)
函数:function (java中)方法
一段具有某项功能的代码的集合,是c语言中管理代码的最小单位
把代码封装成一个个的函数,是为了方便管理和调用代码。
函数的分类:
cpp_ref_ch.chm查看大部分函数
标准库函数:
C语言标准委员会为了c语言以函数形式提供的一些基础的功能,被封装在libc.so库中,以头文件形式调用
需要包含头文件,只需要写函数名+(参数)调用即可
isalnum() | 当字母或数字字符时, 返回真值 |
---|---|
isalpha() | 当字母字符时, 返回真值 |
iscntrl() | 当控制字符时, 返回真值 |
isdigit() | 当数字字符时, 返回真值 |
isgraph() | 当非空格可打印字符时, 返回真值 |
islower() | 当小写字母字符时, 返回真值 |
isprint() | 当可打印字符时, 返回真值 |
ispunct() | 当标点字符时, 返回真值 |
isspace() | 当空格字符时, 返回真值 |
isupper() | 当大写字母字符时, 返回真值 |
以下函数都是libm.so
sqrt
pow
double floor(double arg)
功能:返回小于等于最大整数 向下取整
double ceil 向上取整
double fabs(doubule arg)
浮点型的arg的绝对值
time
include < time.h >
#include< stdlib.h >
int sys(const char *command)
#include<stdlib.h>
void srand(unsigned seed);
功能:种一个随机种子;
int rand(void);
abort() | 停止程序执行 |
---|---|
assert() | 当表达式非真,停止程序执行 |
atexit() | 当程序退出执行设定的程序 |
bsearch() | 执行折半查找 |
exit() | 停止程序执行 |
getenv() | 获取指定环境变量的值 |
longjmp() | 从设定点执行程序 |
qsort() | 执行快速排序 |
raise() | 向程序发送信号 |
rand() | 返回一个随机数 |
setjmp() | 设置程序执行点 |
signal() | 将某函数设置成一个信号句柄 |
srand() | 初始化随机数发生源 |
system() | 执行系统调用 |
va_arg() | 使用可变长度参数列表 |
练习4:获取10个范围是100-1000的随机数
rand()%901+100
[a,b]
rand()%(b-a) +a
练习5:产生随机双色球6个1-33的数 和1个1-16的数
系统函数:(不是函数)
是操作系统以函数接口形式提供的一些功能;这些功能包括:
内存管理,信号处理,文件IO,文件管理,进程管理,进程通信,线程管理,*网络通信*
,线程同步。
第三方库函数:
别人写好的库给你用,比如说 日志记录glog
md5 验证 密码加密库
json 序列化和反序列化
自定义函数:
为了更好地管理代码,减少冗余把代码封装成函数的形式;
注意:希望你一个函数不要超过50行,一个函数负责一个功能,为了管理代码
函数声明:
函数声明的目的是为了告诉编译器:函数使用的形式
返回值类型:函数名(类型1 变量1,类型2 变量2,…);
要求:1.在c语言中函数名一般小写,用下划线分隔
2.void 指代参数为空 不需要参数 如果给参数就报错,不要空着,如果返回值为空也用void
int main也可以 去掉int 但是不建议
3.如果不需要返回值也写void
4.如果void func(int num)声明也可以写成void func (int) 可以 但是不建议!
隐式声明:当调用函数没有定义,就会产生隐式声明,编译器会猜测函数的格式,返回值会猜测成int类型,参数
列表会根据提供的参数来猜测。
函数定义:
返回值类型:函数名(类型1 变量1,类型2 变量2,…)
{
函数体
需要返回值
return 0
(如果是void类型,可以写return;用于结束函数 但是不可以写return 0会警告甚至报错 取决于编译器)
}
注意:如果定义写在调用之前,函数声明可以省略。但是目前还是以养成习惯为大前提
函数调用:
函数名(实参);
返回值会放在调用时的位置,可以立即使用,也可以赋值
练习:
1.实现一个函数,判断一个整数是否是素数,显示100-10000之间的所有的素数
2.输入两个日期 计算出两个日期之间相隔了多少天。
3.实现一个函数,判断一个整数是否是回文数,调用函数判断1亿到10亿之间的所有回文数
4.计算100的阶乘
5.输入一个整数,显示它的补码