[英]Python unsigned integers operations like C
import ctypes
def main():
key = 0xDEADBEEF
print(f"({type(key)}) {key = }")
key = key * 5 + 2
print(f"({type(key)}) {key = }")
key = key * 5 + 2
print(f"({type(key)}) {key = }")
key = key * 5 + 2
print(f"({type(key)}) {key = }")
key = ctypes.c_uint(0xDEADBEEF)
print(f"({type(key)}) {key.value = }")
key = ctypes.c_uint(key.value * 5 + 2)
print(f"({type(key)}) {key.value = }")
key = ctypes.c_uint(key.value * 5 + 2)
print(f"({type(key)}) {key.value = }")
key = ctypes.c_uint(key.value * 5 + 2)
print(f"({type(key)}) {key.value = }")
if __name__ == '__main__':
main()
如果你运行它,它会输出:
(<class 'int'>) key = 3735928559
(<class 'int'>) key = 18679642797
(<class 'int'>) key = 93398213987
(<class 'int'>) key = 466991069937
(<class 'ctypes.c_ulong'>) key.value = 3735928559
(<class 'ctypes.c_ulong'>) key.value = 1499773613
(<class 'ctypes.c_ulong'>) key.value = 3203900771
(<class 'ctypes.c_ulong'>) key.value = 3134601969
为什么它在 python 上不断增长?
有什么方法可以在不使用 ctypes 的情况下复制 C 所做的事情,还是只是 python 的工作方式?
好的,感谢@n.1.8e9-where's-my-sharem,我了解到在 C 中, uint
的上限为 32 位,并且为了在 python 中获得同样的效果,我们可以使用number modulo 2^32
def main():
key_a = 0xDEADBEEF
key_b = uint32(0xDEADBEEF)
printBinary(key_a)
printBinary(key_b)
print('--')
key_a = key_a * 5 + 2
key_b = uint32(key_b * 5 + 2)
printBinary(key_a)
printBinary(key_b)
print('--')
key_a = key_a * 5 + 2
key_b = uint32(key_b * 5 + 2)
printBinary(key_a)
printBinary(key_b)
print('--')
key_a = key_a * 5 + 2
key_b = uint32(key_b * 5 + 2)
printBinary(key_a)
printBinary(key_b)
print('--')
key_a = key_a * 5 + 2
key_b = uint32(key_b * 5 + 2)
printBinary(key_a)
printBinary(key_b)
def printBinary(argument) -> None:
binary_repr = f"{argument:<15} in binary {argument:>43b}"
print(binary_repr)
def uint32( n, num_bits=32):
return n % (2 ** num_bits)
if __name__ == '__main__':
main()
因此,如果我们运行前面的代码,我们会得到:
3735928559 in binary 11011110101011011011111011101111
3735928559 in binary 11011110101011011011111011101111
--
18679642797 in binary 10001011001011001001011101010101101
1499773613 in binary 1011001011001001011101010101101
--
93398213987 in binary 1010110111110111101111010010101100011
3203900771 in binary 10111110111101111010010101100011
--
466991069937 in binary 110110010111010110101100011101011110001
3134601969 in binary 10111010110101100011101011110001
--
2334955349687 in binary 100001111110100110001011110010011010110111
2788107959 in binary 10100110001011110010011010110111
我们可以看到,使用 function uint32
我们可以保留密钥的前 32 位。
Python 整数可以是任意大小(它们是bignums )。 在许多其他编程语言中,整数是固定大小的并且溢出/环绕模 2 number_of_bits 。
如果您想在 Python 中复制这些语言的行为,最简单的方法是添加显式减少模 2 number_of_bits 。 有几种等效的方式来表达这种减少:
n = n % (2**nbits)
n = n % (1<<nbits)
n = n & ((1<<nbits) - 1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.