对DSP中unsigned long的发现以及对各种变量类型的总结

来源:互联网 发布:分布式更新数据 编辑:程序博客网 时间:2024/06/05 20:50
今天早上在调试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可以的。所以以后要小心了。
0 0