我看到一些奇怪的事情。
我试着用bash Shell把hex转换成dec
我用了非常简单的命令。

$ g_receiverBeforeToken=1158e460913d00000
$ echo $((16#$g_receiverBeforeToken))
1553255926290448384

如你们所知,这个结果应该是“200000000000000”。
当我输入其他十六进制数时,它是正确的。但只有1553255926290448384是奇怪的。

最佳答案

不仅仅是那个数字,它是任何超过7fffffffffffffff的数字,因为它使用64位整数,这是最大的一个。16位数字环绕并变为负数(因为two's complement representation of signed integers):

$ echo $((16#7fffffffffffffff))
9223372036854775807
$ echo $((16#7fffffffffffffff + 1))
-9223372036854775808
$ echo $((16#8000000000000000))
-9223372036854775808

经过ffffffffffffff(又名-1),它返回到零:
$ echo $((16#ffffffffffffffff))
-1
$ echo $((16#ffffffffffffffff + 1))
0
$ echo $((16#10000000000000000))
0

最终结果:只有最后16个十六进制数字才是真正重要的;任何超过64位整数表示高端的内容都会被删除:
$ echo $((16#0000000000000010))
16
$ echo $((16#10000000000000010))
16
$ echo $((16#ffffffff0000000000000010))
16

由于1553255926290448384的长度为17位,因此第一位将以这种方式删除:
$ echo $((16#1158e460913d00000))
1553255926290448384
$ echo $((16#158e460913d00000))
1553255926290448384
$ echo $((16#121345158e460913d00000))
1553255926290448384

07-24 09:35
查看更多