问题:这几天写代码时候遇到一个问题,因为一些便于数据处理的需求。需要将一个s32数据(有符号32位)拆成俩u16(无符号位数据存储),然后使用该数据计算时,又需要转换成s64(有符号64位计算)。当数据都为正数时候,不会出错;当数据出现负数时候,总会出现一些奇奇怪怪的错误。
实例
现有s32数据类型的数0xFFFF 0203
,在做处理时候,一开始的做法是:
int32_t dat = 0xFFFF0203;Parameter[1] = (dat&0xFFFF0000)>>16;Parameter[2] = dat;int64_t Temp;Temp = (int64_t)(((uint32_t)Parameter[1])<<16)| Parameter[2];
以上这种做法在数据为正数时候完全没有问题,但是当数据出现为负数时,数据往往相差很大。最后Temp
结果会是(s64)0x00000000FFFF0203
,也就是被解释成了一个正数。如果我们想要使0xFFFF0203
被解释为一个负数,那么就需要将其最高位的符号位先解释为符号位再进行类型转换,。即改为(将uint32_t
改为int32_t
):
int64_t Temp;Temp = (int64_t)(((int32_t)Parameter[1])<<16)| Parameter[2];
总结
虽然这个问题很小,但有时候还是会被经常忽视。所以需要注意,在进行有符号数据和无符号数据间的转换时,每转换一步都要特别注意对符号位的解释。