类型宏定义

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+

可读可写

文件不存在自动新建

打开指针指向文件的开头

打开文件会清空文件

可以从任意地方读写并且覆盖原内容