为什么两个不同的整数可以转换为相同的十六进制数?

时间:2016-12-29 03:19:18

标签: mysql hex

我必须在一个项目中工作,我们在HEX中有一个标识符。

示例B900001752F10001是在SIGNED LONG变量的 JAVA 中开发的解析器中收到的。我们将该变量存储在MySQL DB中的SIGNED BIGINT变量中。

每当我们需要HEX链时,我们都会使用HEX(代码)功能,我们得到了预期的结果。

但是当我们必须配置主表时,我们需要输入有效代码,以实现我们使用的类似:

Update employee set code=0xB900001752F10001 where main_employee_id=1002;

它在过去生产的代码中存储在DB中作为

13330654997192441857

但是现在我们正在使用相同的指令,我们将代码存储在DB中

-5116089076517109759

因此,使用HEX功能比较这两个数字,那些提供相同的HEX NUMBER。

select HEX(-5116089076517109759), HEX(13330654997192441857)
0xB900001752F10001, 0xB900001752F10001

有人可以提供为什么会这样吗?我们应该如何从供应角度处理这个问题,以确保存储为13330654997192441857,以便在验证事件发生时代码匹配。

我没有任何其他想法,我感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

我认为你已经溢出了数据类型。

根据MySQL manual,签名的bigint在

范围内
aws route53 get-change --id <value from previous cli>

-9,223,372,036,854,775,808 

您的电话号码

9,223,372,036,854,775,807

已超过上述正值,因此溢出并且是 解释为负数。

说完了,我想你的命令可能仍然没问题 - 只有当你试图将十六进制模式解释为数字时,结果才会令人困惑。

18,446,744,073,709,551,615

答案 1 :(得分:0)

64bite机器,最高位是符号位,所以最大数字是9,223,372,036,854,775,807,但是如果你的数字多于它,则最高位将转换为1,因此num将为负数且溢出。 所以你的13330654997192441857将成为5116089076517109759。