其他人没有解释为什么你的代码没有工作,所以我来简单分析一下:
memcpy(pshort , pchar + 1 , 1);
memcpy(pshort + 1, pchar , 1);
对指针 TYPE * p
进行加法操作会使指针按照 sizeof( TYPE )
的大小增加(因此它会指向下一个元素,但请记住,这仅在数组内部时才被定义)。所以,虽然 pchar + 1
是正确的,但是 pshort + 1
不正确(因为它是寻址下一个 short
)。
aux = ((*pchar & 0x00FF) << 8) | ((*(pchar+1) & 0xFF00) >> 8);
哦,右侧的代码有多个问题。首先,*(pchar+1)
是一个 char
类型,而且对 char
类型使用 & 0xFF00
会始终得到 0(因为 char
只有 8 位,至少在现代计算机上...)。然后你又向右移动了这 8 位...?
另外,如果你不使用左侧的 0x00FF(将 *pchar
提升为与右侧操作数相同的宽度),而是使用大小为 char
的 0xFF,那么该操作的结果仍然是 char
类型,而将其向左移动 8 位也没有太大意义(因为类型不会像魔法一样扩展)。
另一种解决方案是使用 union
:
#include <stdio.h>
struct chars_t
{
char first;
char second;
};
union combo_t
{
short shrt;
struct chars_t chrs;
};
int main()
{
union combo_t x;
x.chrs.first = 0x01;
x.chrs.second = 0x02;
printf( "%x", x.shrt );
return 0;
}
如果您将此用于更大的上下文中,请注意结构体填充。
memcpy((void *)pshort, (const void*)pchar, sizeof(short));
。 - Alex F