先看取非符:
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字节补齐)