类型宏定义
typedef char s8;//8位 => (-128 - 127)
typedef short s16;//16位 => (-32768 - 32767)
typedef int s32;//32位 => (-2147483648-2147483647) => 21亿
typedef long long s64;//32位 => (-2147483648-2147483647)
typedef unsigned char u8;//8位 => (0 - 255)
typedef unsigned short u16;//16位 => (0-65535)
typedef unsigned int u32;//32位 => (0-4294967295) => 42亿
typedef unsigned long long u64;//32位 => (0-4294967295)
宏替换
linux
#define tgp(format, args...) (printf("[PRINTF]func = %s line = %d:[" format "]\r\n", __FUNCTION__ , __LINE__, ##args))
window
#define tgp(format, ...) (printf("[PRINTF]func = %s line = %d:[" format "]\r\n", __FUNCTION__ , __LINE__, __VA_ARGS__))
typedef union {
u8 p_state;
struct _state {
u8 p_speed : 3,
p_link : 1,
p_enable : 1,
p_type : 1,
p_is_maxspeed : 1,
p_is_trunk : 1;
}p;
}P_STATE;
typedef struct {
u16 dev_id;
u8 dev_type : 4,
dev_guard : 1,
dev_enable : 1,
dev_online : 1,
d_reserve : 1;
P_STATE p_state;
#define p_state p_state.state;
#define p_speed p_state.p.p_speed;
#define p_link p_state.p.p_link;
#define p_enable p_state.p.p_enable;
#define p_type p_state.p.p_type;
#define p_is_maxspeed p_state.p.p_is_maxspeed;
#define p_is_trunk p_state.p.p_is_trunk;
}D_SWITCH;
名称 | 说明 |
---|---|
联合体 | 定义的类型共用一块内存,内存的大小由最大的成员决定。定义不规范,要考虑对齐。 |
位域 | 把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。 |
无符号 | 范围 |
1位 | 0-1 |
2位 | 0-3 |
3位 | 0-7 |
4位 | 0-15 |
5位 | 0-31 |
6位 | 0-63 |
7位 | 0-127 |
补码,浮点数,与(&),或(|),异(^),非(~),左移(<<),右移(>>)
补码-解决负数运算
负数这个概念引出了补码,补码是为了解决正负运算的问题
通过进一归零舍位完美解决了正负运算问题
负数的原码 + 负数的补码
1001 + 1110 = 1 0111 =>舍位 0111 + 1 = 1000
1010 + 1101 = 1 0111 =>舍位 0111 + 1 = 1000
1011 + 1100 = 1 0111 =>舍位 0111 + 1 = 1000
补码很神奇
负数的原码 = (负数的补码 - 1 再取反)
负数的原码作用就是好理解这是个负数
这东西很神奇,其中的运算道理真的说不出,只可理会,不可言谈
浮点数-解决小数存取
float 4个字节32位
符号位占1位
指数位占 8 位 指数位的第一位是指数的符号位, 范围就是 -128 到 127
值位占 23位 这个位用来存小数的,小数点左边是默认是1(隐藏条件),一共可以表示24位的数
2的24次方就是 16777216, 23位可以表示的最大值就是16777215
10^7 < 16777215< 10^8
小数部分的值在7位就会出现不准了
可以肯定小数保留6位没得问题
单精度浮点的表示范围 -3.40E+38 到 +3.40E+38 这个东西也算不出来是多少啊
double 8个字节64位
符号占1位
指数占11位 指数位的第一位是指数的符号位, 范围就是 -1025 到 1024
位数位占52位 表示的范围已经很大了,写了也看不懂
2的53次方有16个数字
10^15 < double小数值 < 10^16
可以肯定小数保留14位没得问题
范围-1.7E-308~1.7E+308
使用浮点数的注意事项
想要精确运算就用整数
与(&),或(|),异(^),非(~),左移(<<),右移(>>)
&
=> 真真为真,真假为假,假假为假 => 1&1 = 1
, 1&0 = 0
, 0&0 = 0
|
=> 真真为真,真假为真,假假为假 => 1|1 = 1
, 1|0 = 0
, 0|0 = 0
^
=> 真真为假,真假为真,假假为假 => 1^1 = 0
, 1^0 = 1
, 0^0 = 0
~
=> 真为假,假为真 => ~1 = 0
,~0 = 1
<<
=> 左移 => 所有位向左偏移 => ( i << n
表示 i
乘以2的n次方
)
>>
=> 右移 => 所有位向右偏移 => ( i >> n
表示 i
除以2的n次方
)
小于号是左移
大于号是右移
加法运算
先或后异,异位进一归零,反复运算直到异位为零,返回或值
a+b = a^b + (a&b) << 1
int Add(int a, int b)
{
return (b == 0) ? a : add(a ^ b, (a & b) << 1);
}
减法运算
补码运算,运算法则一样,核心规则进一舍位
a-b = a+(~b+1)
int negtive(int a) //取补码
{
return Add(~a, 1);
}
int Sub(int a, int b)
{
return Add(a, negtive(b));
}
乘法运算
a*b = b个a的合
负负得正,正负得负,正正得正
非常复杂
实现链接:https://www.cnblogs.com/scotth/p/9162078.html
除法运算
a/b = a 可以减去多少个b
负负得正,正负得负,正正得正
非常复杂
实现链接:https://www.cnblogs.com/scotth/p/9162078.html
文件打开方式
(ASCII和Binary)文本方式和二进制打开文件的区别
Binary
二进制会原封不动的读写文件
ASCII
文本读写将文件中的ASCII码转换成在保存在内存变量中
文本方式对换行符
在不同的系统中有不同的处理方式
例:windows中如果以文本方式写文件的话,换行符会变成\r\n,读取的时候又会转换会\n
注意
用文本模式写文件,读取时也要用文本模式,二进制模式同样
二进制比文本效率快
r
= read
a
= apped
w
= write
打开模式 | 只可以读 | 只可以写 | 读写兼备 | |||
---|---|---|---|---|---|---|
文本模式 | r | w | a | r+ | w+ | a+ |
二进制模式 | rb | wb | ab | rb/(r+b) | wb/(w+b) | ab/(a+b) |
r/rb
只能读取文件
文件不存在返回NULL
打开指针指向文件的开头
打开文件不会清空文件
可以从任意地方读
r+/rb+
可读可写
文件不存在返回NULL
打开指针指向文件的开头
打开文件不会清空文件
可以从任意地方读写并且覆盖原内容
a/ab
只能写入文件尾部
文件不存在自动新建
打开指针指向文件的尾部
打开文件不会清空文件
只能在文件尾追加写入
a+/ab+
可读可写
文件不存在自动新建
打开指针指向文件的尾部
打开文件不清空文件
任意地方读,写入只能在尾部追加写入
w/wb
可以任意位置写入文件
文件不存在自动新建
打开指针指向文件的开头
打开文件会清空文件
可以从任意位置写入,写入自动覆盖
w+/wb+
可读可写
文件不存在自动新建
打开指针指向文件的开头
打开文件会清空文件
可以从任意地方读写并且覆盖原内容