簡體   English   中英

如何在 python 中准確模擬 `int32`,帶符號的 2 的補碼 32 位整數

[英]How to accurately emulate `int32`, signed 2's complement 32-bit integers, in python

Python 支持任意位長度的整數,但我想模擬int32 ,32 位整數,在它們所有的溢出榮耀中。

我對此沒有什么問題和意見

  1. int32具有INT32_MIN = -(1 << 31)INT32_MAX = (1 << 31) - 1
  2. python 是否使用 2 的補碼?
  3. int32中,正int32的第 31 位前導零,負int32的第 31 位前導零(這是因為它們是 2 的補碼)。
  4. 在 python 中,正 integer 被認為有無限(或任意)多個前導,而負 integer 被認為具有無限(或任意)多個前導。

例如:

123看起來像:

  • 0b0000_0000_0000_0000_0000_0000_0111_1011 in int32
  • 0b...0_0111_1011 in python( ...0表示無限多個前導0

-123看起來像:

  • 0b1111_1111_1111_1111_1111_1111_1000_0101 in int32
  • 0b...1_1000_0101 in python( ...1表示無限多個前導1

鑒於這一切,我想出了這段代碼來模擬int32 ,但想要檢查一下:

INT32_MIN = -(1 << 31)
INT32_MAX = (1 << 31) - 1
INT32_MASK = (1 << 32) - 1
INT32_SIGNBIT = 1 << 31

def int32(x):
    sb = bool(x & INT32_SIGNBIT)
    i32 = x & INT32_MASK
    if sb:
        i32 += ~INT32_MASK
    return i32

a = int32(INT32_MAX + 1)
b = int32(INT32_MIN - 1)
aa = a == INT32_MIN
bb = b == INT32_MAX

當您將INT32_MAX1或從INT32_MIN減去1時,它似乎確實會溢出,這讓我有信心它是正確的,但這只是兩個測試用例。 這對你來說正確嗎?

它看起來是正確的,您對二進制補碼整數和 Python 對它們的理解也是正確的。 實現可以簡化,對於簡化的一些定義(也許更難掌握)。

或者它可以這樣做:

def int32(x):
    x = x & 0xffffffff
    return (x ^ 0x80000000) - 0x80000000

第一行很明顯,第二行通過用 XOR 翻轉符號然后用減法翻轉它來執行符號擴展,如果需要,這也會設置無限前導位。

  • 如果符號為零,則 XOR 設置它,減法重置它,沒有任何有趣的事情發生。
  • 如果符號是 1,則 XOR 將其重置,減法將其設置但也會生成借位,因此將設置下一位,依此類推。 值得慶幸的是,這不需要無限的時間,無限的前導位是隱式的,實際上並不是一一計算的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM