将8位的有符号数强转64位的无符号数的坑

今天在做公司大数据分析时遇到个坑,某些数据莫名其妙变得特别大:


 最终定位出原因在这个强转这里


当8位有符号数扩展为64位无符号数时,底层汇编实际上使用的是movsx带符号扩展指令,意思就是扩展的那些位都用符位来补全,这里就造成了value的高58位全为1,从而值异常大

我们再来做个简单测试:



-29和157的二进制是一样的10011101,为何强转后的值不一样,原因在于计算机内存负数的方式为补码,所以实际上-29的内存为11100011,157的内存为10011101,它们在强转为无符号64位后分别为上图中的值。

 下面我是这样解决这个问题的,先强转类型,再取内容,这样相当于从无符号转为无符号类型,底层使用的MOVZX指令,在转换过程中高位都由零填充。


扫描二维码关注公众号,回复: 51413 查看本文章

猜你喜欢

转载自blog.csdn.net/anliayx/article/details/80054784
今日推荐