tmd的,不知道哪个蠢货,16进制转码10进制的结果溢出了还照样用,原则上不建议这样,但是历史原因也就一直用了下来;
连window上的计算机也是这样,估计也不会修改把bug当feature了.
使用golang还不能容易复现这个问题,因为转换溢出会有提示,还好依稀记得大学专业课上老师提到过的 整型与非整型转换的原理: 取反码, +1…
以下是实现
golang https://go.dev/play/p/vQOXCvXorBn
func Hex2Dec(hex string) int64 {
decimal, err := strconv.ParseUint(hex, 16, 64)
if err != nil {
fmt.Println(err)
return 0
}
fmt.Printf("ret^1*: %v\n", decimal^0xFFFFFFFFFFFFFFFF+1)
fmt.Printf("1-ret: %d\n", int64(1-(decimal^0xFFFFFFFFFFFFFFFF+2)))
return int64(1 - (decimal ^ 0xFFFFFFFFFFFFFFFF + 2))
}
func Hex2DecStr(hex string) string {
return fmt.Sprintf("%d", Hex2Dec(hex))
}
lua则直接调用就可以复现(c实现的缘故)
print(tonumber("8e62a857bb000827",16))