1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > C语言——负数据强制类型转换注意事项

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

时间:2023-08-05 13:43:27

相关推荐

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];

总结

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。