繁体   English   中英

Python 无符号整数运算,如 C

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM