在我的程序中,我以 int 类型存储值 512。
#include <stdio.h>
int main()
{
unsigned int i = 512 ;
char *c = (char*)&i;
printf("c:%u %d\n",c,*c);
printf("c:%u %d\n",c+1,*(c+1));
printf("c:%u %d\n",c+2,*(c+2));
printf("c:%u %d\n",c+3,*(c+3));
}
另见
c:3493911684 0
c:3493911685 2
c:3493911686 0
c:3493911687 0
解释:512=1000000000 => 00000010 0000000=>02 00.即 00 00 02 00.所以这里 MSB 和 LSB =00.在 LE 机器中 LSB 应该放在最低内存中。因此上述程序的可能输出应该是 00,02,00,00,这也是我得到的输出。但是在解释它究竟是如何得出 512 时。它是否在寄存器中进行任何计算。有人可以对此提供一些输入吗?
第二个问题是,网络中字节的传输是否与机器的字节顺序无关,或者传输是否也采用与存储相同的顺序?比如在 LE 中存储时我们遵循(先 LSB,然后 MSB),那么对于传输也遵循先 LSB 字节然后 MSB。
答案1
按照定义,小端机器中的寄存器将是小端的。
上述字节在任何介质上的传输当然与此无关。您需要遵守协议,该协议规定在发送时将字节按特定顺序排列,并且接收的任何字节都按特定顺序排列 -unix 套接字 API 有类似的东西htonl()
例如。如果它们没有按照正确的顺序排列,你需要在处理它们之前先将它们翻转过来。