我想出了一种看起来可行的方法。虽然有点丑陋。
第一步是比较前32位,因为2个补码#的MSB符号位保持不变,因此数字保持正确的关系
-1 —> -10 —> 09223372036854775807 = 0x7fff ffff ffff ffff -> 0x7ffff ffff = 2147483647
因此,除非MSB的工作结果相等,否则从MSB的工作中返回结果,则需要对LSB进行检查。
我有几个案例来建立一些模式:
-1 = 0xffff ffff ffff ffff-2 = 0xffff ffff ffff fffe32 bit is:-1 -> 0xffff ffff = -1-2 -> 0xffff fffe = -2-1 > -2 would be like -1 > -2 : GOOD
和
8589934591 = 0x0000 0001 ffff ffff8589934590 = 0x0000 0001 ffff fffe32 bit is:8589934591 -> ffff ffff = -18589934590 -> ffff fffe = -28589934591 > 8589934590 would be -1 > -2 : GOOD
MSB的符号位无所谓b / c负数之间的关系与正数相同。例如,无论符号位如何,lsb值始终为
0xff>
0xfe。
如果低32位的MSB不同怎么办?
0xff7f ffff 7fff ffff = -36,028,799,166,447,6170xff7f ffff ffff ffff = -36,028,797,018,963,96932 bit is:-..799.. -> 0x7fff ffff = 2147483647-..797.. -> 0xffff ffff = -1-..799.. < -..797.. would be 2147483647 < -1 : BAD!
因此,我们需要忽略低32位的符号位。而且,由于LSB的关系与符号无关,因此它们相同,因此在所有情况下仅使用最低的32位无符号即可。
这意味着我要为MSB的符号和无符号对于LSB -所以换款
I4到
i4对于LSB。也使big
endian成为正式文件,并在struct.unpack调用上使用“>”:
-- ...local comp_int64s = function (as0, au1, bs0, bu1) if as0 > bs0 then return 1 elseif as0 < bs0 then return -1 else -- msb's equal comparing lsbs - these are unsigned if au1 > bu1 then return 1 elseif au1 < bu1 then return -1 else return 0 end endendlocal l, as0, au1, bs0, bu1as0, l = bit.tobit(struct.unpack(">i4", ARGV[1]))au1, l = bit.tobit(struct.unpack(">I4", ARGV[1], 5))bs0, l = bit.tobit(struct.unpack(">i4", blob))bu1, l = bit.tobit(struct.unpack(">I4", blob, 5))print("Cmp result", comp_int64s(as0, au1, bs0, bu1))


