有如下代码:
#include
void setparam(int *freq,unsigned short *symb,unsigned short *qam)
{
printf("setparam\n");
printf("freq = 0x%x,symb = 0x%x,qam = 0x%x\n",freq,symb,qam);
*freq = 626;
*symb = 6875;
*qam = 64;
printf("freq = %d,symb = %d,qam = %d\n",*freq,*symb,*qam);
printf("setparam\n");
}
int main()
{
int freq = 0;
unsigned short symb = 0;
char qam = 0;
printf("\n");
printf("freq = 0x%x,symb = 0x%x,qam = 0x%x\n",&freq,&symb,&qam);
setparam(&freq,&symb,&qam);
printf("\n");
printf("freq = %d,symb = %d,qam = %d\n",freq,symb,qam);
}
执行结果如下:
freq = 0xbfce8120,symb = 0xbfce811e,qam = 0xbfce811d
setparam
freq = 0xbfce8120,symb = 0xbfce811e,qam = 0xbfce811d
freq = 626,symb = 6656,qam = 64
setparam
freq = 626,symb = 6656,qam = 64
当前平台是小端模式的,即低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。
1d--------1e--------1f--------20--------21--------22--------23--------24
先将 626即 00000000 00000000 00000010 01110010 放入到24至21(小端模式)
然后将6875即 00011010 11011011 放到 1f 和1e里面
然后将64 即 00000000 01000000 分别放到了 1e 1d里面,导致1e里面数据为0,此时1f1e里面的数据变成0001101000000000,转化为 10进制为6656.
此问题只要是传的参数类型不一致导致。