大端和小端的概念
Concept of big endian and little endian
联合中的所有元素都引用同一个内存槽。因此,如果我们将 int 视为 2 个字节,那么它包含的二进制值为 00000001 00000000(256)。由于char的大小是1个字节,所以前半部分(1字节)应该分配00000001,后半部分应该分配00000000。但是为什么下面的代码打印256 0 1
而不是256 1 0
?
#include<stdio.h>
int main()
{
union a{
int i;
char ch[10];
};
union a u;
u.i=256;
printf("%d,%d,%d",u.i,u.ch[0],u.ch[1]);
return 0;
}
你有一台小端*机器。
i 的字节以低字节在前排列。
如果你有一台大端机器,预期的输出就不会是“256 1 0”,除非 sizeof(int)
是 2。我认为你没有 16 位处理器。在更有可能的 sizeof(int)
4 上,您将得到“256 0 0”的输出。试试这个程序:
#include<stdio.h>
int main()
{
union a{
int i;
char ch[sizeof(int)];
};
union a u;
u.i=256;
printf("%d", u.i);
for (int b = 0; b < sizeof(int); ++b)
printf(",%d", (int)(unsigned char)(u.ch[b]));
printf("\n");
return 0;
}
这将显示 u.i
的所有字节,按照处理器的排列顺序排列。
*假设您没有使用 PDP。你不想知道 PDP。
联合中的所有元素都引用同一个内存槽。因此,如果我们将 int 视为 2 个字节,那么它包含的二进制值为 00000001 00000000(256)。由于char的大小是1个字节,所以前半部分(1字节)应该分配00000001,后半部分应该分配00000000。但是为什么下面的代码打印256 0 1
而不是256 1 0
?
#include<stdio.h>
int main()
{
union a{
int i;
char ch[10];
};
union a u;
u.i=256;
printf("%d,%d,%d",u.i,u.ch[0],u.ch[1]);
return 0;
}
你有一台小端*机器。
i 的字节以低字节在前排列。
如果你有一台大端机器,预期的输出就不会是“256 1 0”,除非 sizeof(int)
是 2。我认为你没有 16 位处理器。在更有可能的 sizeof(int)
4 上,您将得到“256 0 0”的输出。试试这个程序:
#include<stdio.h>
int main()
{
union a{
int i;
char ch[sizeof(int)];
};
union a u;
u.i=256;
printf("%d", u.i);
for (int b = 0; b < sizeof(int); ++b)
printf(",%d", (int)(unsigned char)(u.ch[b]));
printf("\n");
return 0;
}
这将显示 u.i
的所有字节,按照处理器的排列顺序排列。
*假设您没有使用 PDP。你不想知道 PDP。