最近在做一个通过USB协议设置camera参数的功能,PC上的工具是同事用delphi写的,今天在和同事联调写数据的时候,碰到一个这样的问题。由于数据结构的需要,我们将两个双字节类型的数据存储到一个整型的数据里面,然后进行传输。delphi语言中如下:
x, y : smallint;(相当于C/C++中的short)
value : integer;(相当于int)
在x,y分别从控件得到值以后,进行的是这样的运算,设定是高16位存储x,低16位存储y
value = x;
value = (value shl 16)or y; 相当于 value = (vlaue << 16) | y;
然后在运行时候出现了问题了,有些数值高16位出现0xFFFF 无数据的现象。
经过查找发现在 “or y”这个或过程中出现问题。
于是我进行了这样的修改 : value = (valueshl 16) or ($FFFF and y);
运行结果终于正常了。
后来我自己分析认为,由于delphi高级语言的特性,在进行类似的位运算时候,一定概率上可能将 y 强制转换为 32位数据,并在高16位自动补位0xFFFF,这样就会出现无论怎么运算,高16位都无数据。