【发布时间】:2015-09-20 08:11:47
【问题描述】:
为了理解位域内存存储,我创建了下面的测试程序。
#include <stdio.h>
int main()
{
int a;
typedef struct {
int b7 : 1;
int b6 : 1;
int b5 : 1;
int b4 : 1;
int b3 : 1;
int b2 : 1;
int b1 : 1;
int b0 : 1;
} byte;
byte ab0 = {0,0,0,0,0,0,0,1};
a = *(int*)&ab0;
printf("ab0 is %x \n",a);
byte ab1 = {0,0,0,0,0,0,1,0};
a = *(int*)&ab1;
printf("ab1 is %x \n",a);
byte ab2 = {0,0,0,0,0,1,0,0};
a = *(int*)&ab2;
printf("ab2 is %x \n",a);
byte ab3 = {0,0,0,0,1,0,0,0};
a = *(int*)&ab3;
printf("ab3 is %x \n",a);
byte ab4 = {0,0,0,1,0,0,0,0};
a = *(int*)&ab4;
printf("ab4 is %x \n",a);
byte ab5 = {0,0,1,0,0,0,0,0};
a = *(int*)&ab5;
printf("ab5 is %x \n",a);
byte ab6 = {0,1,0,0,0,0,0,0};
a = *(int*)&ab6;
printf("ab6 is %x \n",a);
byte ab7 = {1,0,0,0,0,0,0,0};
a = *(int*)&ab7;
printf("ab7 is %x \n",a);
return 0;
}
编译运行
gcc -Wall test.c
./a.out
ab0 is 80
ab1 is 40
ab2 is 20
ab3 is 10
ab4 is 8
ab5 is 4
ab6 is 2
ab7 is 1
当我在线运行代码时,输出相同 http://codepad.org/ntqyuixp
我无法理解它的输出。
预期输出: 根据我的理解,输出应该是
ab0 is 1
ab1 is 2
ab2 is 4
ab3 is 8
ab4 is 10
ab5 is 20
ab6 is 40
ab7 is 80
请让我知道我缺少什么。
字节序有什么作用吗?
应如何为我的预期行为编写代码?
【问题讨论】:
-
我知道您只是为了实验而这样做,但是您将转换为
int*然后取消引用的方法是错误的,如果您将其应用到生产代码中,将会给您带来很多麻烦.不要这样做。标准预见的进行此类检查的方法是union。