数值、位域的内存表示
#include <stdio.h>
#include <string.h>
void see(char*p, int size);
struct weiyu
{
int f1 : 1;
int f2 : 2;
int f3 : 3;
int f4 : 4;
int f5 : 5;
int f6 : 6;
int f7 : 7;
int f8 : 8;
int f9 : 9;
int f10 : 10;
};
void testwy()
{
printf("位域的内存表示 值为0的位即是字段在内存中占用的空间\n");
printf("sizeof(weiyu)=%d\n",sizeof(struct weiyu));
struct weiyu wy1;
memset(&wy1, 0xff, sizeof(wy1));
wy1.f1 = 0;
see((char *)&wy1, sizeof(wy1));
memset(&wy1, 0xff, sizeof(wy1));
wy1.f2 = 0;
see((char *)&wy1, sizeof(wy1));
memset(&wy1, 0xff, sizeof(wy1));
wy1.f3 = 0;
see((char *)&wy1, sizeof(wy1));
memset(&wy1, 0xff, sizeof(wy1));
wy1.f4 = 0;
see((char *)&wy1, sizeof(wy1));
memset(&wy1, 0xff, sizeof(wy1));
wy1.f5 = 0;
see((char *)&wy1, sizeof(wy1));
memset(&wy1, 0xff, sizeof(wy1));
wy1.f6 = 0;
see((char *)&wy1, sizeof(wy1));
memset(&wy1, 0xff, sizeof(wy1));
wy1.f7 = 0;
see((char *)&wy1, sizeof(wy1));
memset(&wy1, 0xff, sizeof(wy1));
wy1.f8 = 0;
see((char *)&wy1, sizeof(wy1));
memset(&wy1, 0xff, sizeof(wy1));
wy1.f9 = 0;
see((char *)&wy1, sizeof(wy1));
memset(&wy1, 0xff, sizeof(wy1));
wy1.f10 = 0;
see((char *)&wy1, sizeof(wy1));
}
void binarryStr(char c, char str[9]){
for (size_t i = 0; i < 8; i++)
{
str[7 - i] = (c & 1 == 1) ? '1' : '0';
c = c >> 1;
}
}
void see(char*p, int size)
{
for (int i = 0; i<size; i++)
{
char c = *(p + i) ;
char str[9] = { 0 };
binarryStr(c, str);
printf("%s ", str);
}
printf("\n");
}
void testshuzhi()
{
printf("数值的内存表示0 ~ 3,0xff-2 ~ 0xff+4 \n");
for (size_t i = 0; i < 4; i = i+1)
{
see((char *)&i, 4);
}
printf("\n");
for (size_t i = 0xff-2; i < 0xff+4; i = i + 1)
{
see((char *)&i, 4);
}
}
int main()
{
testwy();
printf("\n");
testshuzhi();
return 0;
}
注意:
1,大端模式:高字节在内存的低地址中。假设内存地址从左往右升高,则高字节在左边,简单记为大端模式大数在前,小端模式大数在后。
2,小端模式下,第一比特位在第一字节最后一位,以此往前递推,直至本字节用完,再从第二字节第一比特位开始。
3,位域占用的比特位顺序与数值的比特位顺序相同。