DSP中unsigned long的发现以及对各种变量类型的总结
[复制链接]
在调试DSP上的进程通信时,出现了一个比较怪诞的现象,我把原来一个DWORD,也就是unsigned int型的变量改成unsigned long以后,程序出错了,常识告诉我们,32位机器上long和int都是4个字节,DEBUG以后我发现,那个unsigned long变量居然占了8个字节,收方int型变量和发方long型变量,在字节数不同的情况下相减,结果出现了错误。我比较好奇,于是做了一个实验,将工程里添加了几个打印信息:
printf("sizeof short is %d\n",sizeof(short));
printf("sizeof int is %d\n",sizeof(int));
printf("sizeof long is %d\n",sizeof(signed long));
printf("sizeof unsigned long is %d\n",sizeof(unsigned long));
printf("sizeof long long is %d\n",sizeof(long long));
然后load到仿真器运行,打印的结果如下:
sizeof short is 2
sizeof int is 4
sizeof long is 8
sizeof unsigned long is 8
sizeof long long is 8
所以得出的结论是:ti开发平台上,long和int是不一样的!切记切记啊!
再补充一点,在一个指针被申明为某一类型时,它在被强制转换后为一次性用品,下次使用还需再次强制转换,系统没有提供记忆功能,这样也好,免得转来转去,不知道转成什么类型了。如:
int ALM_Pack_Commands(char * buf)
CmdType= *(ICOMCmd *)buf;
CameraControlProtocol((IpcReport *)(buf + (sizeof(ICOMCmd))));
ICOMCmd 为四个字节,但是如果将第三句话写成
CameraControlProtocol((IpcReport *)(buf + 1)));
就错了,因为buf虽然做过一次强制转换,但转换完后系统仍然认为buf为char *型。写为buf + 4可以的。所以以后要小心了。
|