C语言——负数据强制类型转换注意事项

问题:这几天写代码时候遇到一个问题,因为一些便于数据处理的需求。需要将一个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];

总结

  虽然这个问题很小,但有时候还是会被经常忽视。所以需要注意,在进行有符号数据和无符号数据间的转换时,每转换一步都要特别注意对符号位的解释

你可能感兴趣的:(C语言)