1. ホーム
  2. python

[解決済み] Pythonで符号付き整数と符号なし整数を変換する方法

2023-03-26 13:15:27

質問

例えば、次のような数字があるとします。 i = -6884376 . これを符号なし変数として参照するにはどうしたらよいでしょうか? 次のような感じです。 (unsigned long)i のようにC言語で記述します。

どのように解決するのですか?

仮定の話 :

  1. 2の補数表現を念頭に置いている;と。
  2. によって (unsigned long) あなた というのは 符号なし 32 ビット整数です。

を追加するだけです。 2**32 (or 1 << 32) を負の値に追加します。

例えば、-1 に適用します。

>>> -1
-1
>>> _ + 2**32
4294967295L
>>> bin(_)
'0b11111111111111111111111111111111'

仮定その1は、-1を1ビットの固まりと見なすことを意味し、仮定その2は、32個のビットを必要とすることを意味します。

あなたの隠された前提が何であるかは、あなた以外の誰も言うことができませんが。 たとえば、1の補数表現を念頭に置いているのであれば、その表現には ~ というプリフィックス演算子を適用する必要があります。 Python の整数は、無限に広い 2 の補数表現 (通常の 2 の補数のような、しかし無限の数の "sign bit" を持つ) を使っているかのように見せるために懸命に働きます。

また、プラットフォーム C コンパイラが行うことを複製するために ctypes モジュールを使用します。

>>> import ctypes
>>> ctypes.c_ulong(-1)  # stuff Python's -1 into a C unsigned long
c_ulong(4294967295L)
>>> _.value
4294967295L

Cの unsigned long は、このサンプルを実行したボックス上ではたまたま4バイトでした。