取非符和内存对齐进阶(42)

先看取非符:

a=0=(00000000);  ~a=(11111111)=-1
a=1=(00000001);  ~a=(11111110)=-2
a=2=(00000010);  ~a=(11111101)=-3
而计算机里是用补码来存储的,因此111...11101是补码,对应的有符号数是-3
运算也是补码。a&~a = 0

再看内存对齐:

首先只会当下一阶内存大于本阶内存时,才会修改偏移量来对齐。对齐的倍数是4、8
:int a;          //4字节
short int b;  //2字节
char c;       //1字节
(1字节padding, 因为d要从整4字节开始,所以要插入1字节)
float d;       //4字节
(4字节padding, 因为e要从整8字节开始,所以要插入4字节)
double e;   //8字节
long double f; //12字节
(4字节padding, 因为整个结构的长度要能被8整除,这个8是按结构中最长对齐的字段e决定的
,所以要加4字节补齐) 
// //