[英]How to accurately emulate `int32`, signed 2's complement 32-bit integers, in python
Python 支持任意位長度的整數,但我想模擬int32
,32 位整數,在它們所有的溢出榮耀中。
我對此沒有什么問題和意見
int32
具有INT32_MIN = -(1 << 31)
和INT32_MAX = (1 << 31) - 1
int32
中,正int32
的第 31 位前導零,負int32
的第 31 位前導零(這是因為它們是 2 的補碼)。例如:
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_MAX
加1
或從INT32_MIN
減去1
時,它似乎確實會溢出,這讓我有信心它是正確的,但這只是兩個測試用例。 這對你來說正確嗎?
它看起來是正確的,您對二進制補碼整數和 Python 對它們的理解也是正確的。 實現可以簡化,對於簡化的一些定義(也許更難掌握)。
或者它可以這樣做:
def int32(x):
x = x & 0xffffffff
return (x ^ 0x80000000) - 0x80000000
第一行很明顯,第二行通過用 XOR 翻轉符號然后用減法翻轉它來執行符號擴展,如果需要,這也會設置無限前導位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.