파이썬에서 부호있는 정수를 부호없는 정수로 변환하는 방법
이 숫자가 있다고 가정 해 봅시다 i = -6884376. 서명되지 않은 변수를 어떻게 참조합니까? (unsigned long)iC 와 같은 것 .
가정 :
- 2의 보수 표현을 염두에두고 있습니다. 과,
- 함으로써
(unsigned long)당신 말은 , 부호없는 32 비트 정수를
그런 다음 2**32 (or 1 << 32)음수 값 을 추가하면 됩니다.
예를 들어, 이것을 -1에 적용하십시오.
>>> -1
-1
>>> _ + 2**32
4294967295L
>>> bin(_)
'0b11111111111111111111111111111111'
가정 # 1은 -1이 1 비트의 견고한 문자열로 표시되기를 원한다는 것을 의미하고 가정 # 2는 32 비트를 원한다는 것을 의미합니다.
그러나 아무도 당신의 숨겨진 가정이 무엇인지 말할 수 있습니다. 예를 들어 1의 보수 표현을 염두에두고 있다면 ~대신 접두사 연산자 를 적용해야합니다 . 파이썬 정수는 무한히 넓은 2의 보수 표현을 사용하는 환상을주기 위해 열심히 노력합니다 (일반적인 2의 보수와 같지만 무한한 수의 "부호 비트").
플랫폼 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 바이트입니다.
C 캐스트와 동등한 값을 얻으려면 비트 단위로 적절한 마스크를 사용하십시오. 예 unsigned long: 32 비트 인 경우 :
>>> i = -6884376
>>> i & 0xffffffff
4288082920
또는 64 비트 인 경우 :
>>> i & 0xffffffffffffffff
18446744073702667240
C에서 가질 수있는 값을 제공하지만 여전히 부호있는 값이므로 후속 계산에서 음의 결과를 얻을 수 있으며 32 또는 64를 시뮬레이션하기 위해 마스크를 계속 적용해야합니다. 비트 계산.
이것은 파이썬이 모든 숫자를 부호와 크기로 저장하는 것처럼 보이지만 비트 연산은 2의 보수 값에 대한 작업으로 정의되기 때문에 작동합니다. C는 정수를 2의 보수로 저장하지만 비트 수가 고정되어 있습니다. 파이썬 비트 연산자는 2의 보수 값에 대해 작동하지만 마치 무한한 비트 수를 가지고있는 것처럼 : 양수의 경우 왼쪽으로 0이있는 무한대까지 확장되지만 음수는 1이있는 왼쪽으로 확장됩니다. &운영자는 제로에 사람의 왼쪽 문자열을 변경하고 C 값에 맞는 것이다 단지 비트와 함께 당신을 떠날 것입니다.
16 진수로 값을 표시하면 더 명확해질 수 있습니다 (그리고 32 비트 또는 64 비트에 관심이 있음을 표시하기 위해 f의 문자열을 표현식으로 다시 작성했습니다).
>>> hex(i)
'-0x690c18'
>>> hex (i & ((1 << 32) - 1))
'0xff96f3e8'
>>> hex (i & ((1 << 64) - 1)
'0xffffffffff96f3e8L'
C의 32 비트 값의 경우 양수는 2147483647 (0x7fffffff)까지 올라가고 음수는 최상위 비트 세트가 -1 (0xffffffff)에서 -2147483648 (0x80000000)까지 내려갑니다. 마스크에 완전히 맞는 값의 경우 더 작은 마스크를 사용하여 부호 비트를 제거한 다음 부호 비트를 빼서 Python에서 프로세스를 반대로 할 수 있습니다.
>>> u = i & ((1 << 32) - 1)
>>> (u & ((1 << 31) - 1)) - (u & (1 << 31))
-6884376
또는 64 비트 버전의 경우 :
>>> u = 18446744073702667240
>>> (u & ((1 << 63) - 1)) - (u & (1 << 63))
-6884376
이 역 프로세스는 부호 비트가 0이면 값을 변경하지 않고 그대로 둡니다. 그러나 마스크 크기에 맞지 않는 값으로 시작하면 해당 비트가 사라지기 때문에 확실히 역이 아닙니다.
Python에는 기본 제공 서명되지 않은 유형이 없습니다. 수학적 연산을 사용하여 C에서 얻을 수있는 값을 나타내는 새 int 를 계산할 수 있지만 Python int의 "부호없는 값"은 없습니다. Python int는 고정 바이트 크기 정수에 대한 직접 액세스가 아니라 정수 값의 추상화입니다.
structPython 내장 라이브러리를 사용할 수 있습니다 .
암호:
import struct
i = -6884376
print('{0:b}'.format(i))
packed = struct.pack('>l', i) # Packing a long number.
unpacked = struct.unpack('>L', packed)[0] # Unpacking a packed long number to unsigned long
print(unpacked)
print('{0:b}'.format(unpacked))
밖:
-11010010000110000011000
4288082920
11111111100101101111001111101000
풀다:
dec_pack = struct.pack('>L', unpacked) # Packing an unsigned long number.
dec_unpack = struct.unpack('>l', dec_pack)[0] # Unpacking a packed unsigned long number to long (revert action).
print(dec_unpack)
밖:
-6884376
[ 참고 ] :
>BigEndian 작업입니다.l길다.L부호없는 길이입니다.- 에서
amd64아키텍처int및long사용할 수 있도록, 32 비트입니다i및I대신l과L각각.
서명되지 않은 파이썬으로 변환하려면 abs를 사용하십시오.
a=-12
b=abs(a)
print(b)
출력 : 12
python does not have any builtin to convert int to unsigned int.Instead it is having long for longer range.
>>> val = 9223372036854775807 (maximum value of int 64)
>>> type(val)
<type 'int'>
>>> val += 1
>>> type(val)
<type 'long'>
By increasing the value of val by 1, I exceed the limit of a signed 64 bit integer and the value is converted to a long. If Python had used or converted to an unsigned integer, val would still have been an int. Or, not long.
Signed integers are represented by a bit, usually the most significant bit, being set to 0 for positive numbers or 1 for negative numbers. What val & 0xff does is actually val & 0x000000ff (on a 32 bit machine). In other words, the signed bit is set to 0 and an unsigned value is emulated.
An example:
>>> val = -1
>>> val & 0xff
255
참고URL : https://stackoverflow.com/questions/20766813/how-to-convert-signed-to-unsigned-integer-in-python
'Program Club' 카테고리의 다른 글
| Rails : csrf_meta_tag는 어떻게 작동합니까? (0) | 2020.11.26 |
|---|---|
| Rails 4는 OR 쿼리를 지원합니까? (0) | 2020.11.26 |
| 항목을 눌렀을 때 탐색 창을 닫는 방법은 무엇입니까? (0) | 2020.11.25 |
| YouTube iframe 삽입-전체 화면 (0) | 2020.11.25 |
| Angular 2에서 Bootstrap navbar "활성"클래스를 설정하는 방법은 무엇입니까? (0) | 2020.11.25 |