实现两个字节的十六进制数高低位交换再换算成整型数输出

实现两个字节的十六进制数高低位互换再换算成整型数输出
为什么下面的代码能实现高低位互换,同时又实现将两个十六进制数相加?
具体原理是什么?菜鸟一个,求大神解释一下。
char buf[3] = {0x05, 0x01};
int tmp = 0;
memcpy(&tmp, buf, 2);
printf("tmp = %d\n",tmp);
------解决方案--------------------
大端机器和小端机器,以及数据内存布局

---------------------------

------解决方案--------------------
  x1  
------解决方案--------------------
  x2  
------解决方案--------------------
  x3  
------解决方案--------------------
  x4  
------解决方案--------------------

---------------------------
int tmp占4个字节(32位),在内存中的地址也是依次增长。开始的时候x1到x4都是0,memcpy后x1存放的是0x05, x2存放的是ox01,
现在tmp在小端机器上的十六进制是0x00000105,但是在大端机器是0x05010000。所以在大端机器上的字节这种方法是行不通的。