1.位域:与位运算有关系,与结构体也有关系。
- int a:4;表示a只占4位。这就是位域,限定数据的位数,主要是为了节约内存。
- 如果输入, int a:4; 那么默认是会留一个符号位,所以你可以用的就是3位。若需要无符号的需要加上unsigned。
2.类型相同是多个数据能重合就重合 。
struct test { unsigned int num1:1; unsigned int num2:1; }; sizeof(struct test); 这时test的大小是4个字节,
3.若是类型不同,则遵循结构体对齐原则。
一个位域必须存储在同一个字节中,不能跨两个字节。如果一个字节所剩空间不够存放另一位域是,应从下一单元起存放该位域。也可以有意识某位域从下一单元开始。
4.在计算机中,补码在内存中的排列是, 低位在低字节,高位在高字节。高位就是1,低位就是0。比如0000 0001就是1000 0000这样子存储的。如果要打印,则就需要逆序打印。
5.现代的手机(android和ios),电脑,都是低位低字节,linux也是,unix服务器是例外。
位域操作:
#include <stdio.h> #include <stdlib.h> struct bits { unsigned char ch1 : 1; unsigned char ch2 : 1; unsigned char ch3 : 1; unsigned char ch4 : 1; unsigned char ch5 : 1; unsigned char ch6 : 1; unsigned char ch7 : 1; unsigned char ch8 : 1; }; int main() { //printf("大小是:%d",sizeof(struct bits)); int data = 1; int length = 4; struct bits *p = &data; while (length--) { printf("%d%d%d%d% d%d%d%d ", (p + length)->ch8, (p + length)->ch7, (p + length)->ch6, (p + length)->ch5, (p + length)->ch4, (p + length)->ch3, (p + length)->ch2, (p + length)->ch1 ); } system("pause"); }