1.有符号数与无符号数
a 符号量表示法:有符号数保留一位高位表示数的符号,范围:-127~+127。存在问题:-0 与+0
b 二进制补码:范围:-128~+127.
高位为1时,该值为负数。确定数值的方法:从一个9位数组合1 0000 0000(256的二进制形式)减去一个负数的位组合,得 到该负数值的数量值。
例如:1000 0000,作为无符号数时,数值为128.作为有符号数时,该数为负数,1 0000 0000-1000 0000=1000 0000(128),该数为-128(在符号量中该数为-0)。
二进制补码数取相反数:反转每一位,然后再加1. 比如 1是0000 0001,所以-1为 1111 1110+1=1111 1111 。当一个数为负数时,求解其数值,可以使用相反数来求解。例如,1000 0001 ,相反数为0111 1110 +1 =0111 1111 (该相反数为127),所以该数值为-127.
位逻辑运算符:&(与)、|(或)、~(反码)、^(异或)。
掩码:flag&=MASK,flag中的位只有在MASK中对应位是1时才可见。例,ch &=0xff /* ch &= 0377*/ 0xff二进制1111 1111 ,十进制为0377. 该掩码留下ch的最后8位,其余为设为0.无论ch为8位,16位等等,最终被修正到一个字节中。
打开位:flag | = MASK。根据MASK中打开的位将flag中对应的位设为1,其余位不变。
关闭位:关闭flag中的某一位,MASK中对应的位设为0,其余位设为1.flag&=MASK
转置位:flag^=MASK, flag中对应掩码位为1的位被转置,对应掩码位为0的位不改变。
flag: 0 0 1 1
MASK:0 1 0 1
结果: 0 1 1 0
查看某一位: (flag &=MASK)==MASK,屏蔽flag中的其他位,设为0,查看位设为1,然后再与MASK进行比较判断是否相等。
移位运算符:
左移<< ,乘以2的n次幂
右移 >>. 非负数时,除以2的n次幂。对于有符号数,右移操作的结果根据系统可能会有所不同。
例如: 10001010 >>2 --- 00100010 或者----11100010
位字段
位字段是一个signed int 或unsigned int 中一组相邻的位。位字段有一个结构声明建立,该结构声明为每个字段提供标签,并决定字段的宽度。
struct{
unsigned int a:1;
unsigned int b : 2;
unsigned int c : 8;
}code;
创建了1个1位字段,1个2位字段,1个8位字段。赋值code.a=0; code.b=3;code.c=103; 确保值没有超出字段的容量。
若超出,会使用下一个unsigned int存储位置。不允许一个字段跨越两个unsigned int 之间的边界。编译器自动地移位一个这样的字段定义,使字段按unsigned int边界对齐。
struct{
unsigned int a:1;
unsigned int :2;
unsigned int b : 2;
unsigned int :0;
unsigned int c : 8;
}code;
code.a 和code.b之间有一个2位的间隙。code.c存储在下一个int中。