복붙노트

[PYTHON] 파이썬에서 16 진수로 음수 값을 변환하는 방법

PYTHON

파이썬에서 16 진수로 음수 값을 변환하는 방법

바닥 2.6

>>> hex(-199703103)
'-0xbe73a3f'

>>> hex(199703103)
'0xbe73a3f'

양수 값과 음수 값이 같습니까?

calc를 사용할 때 값은 FFFFFFFFF418C5C1입니다.

해결법

  1. ==============================

    1.파이썬의 정수는 임의로 커질 수 있습니다. 원시 2의 보수를 원하는 방식으로 계산하려면 원하는 비트 폭을 지정해야합니다. 귀하의 예는 64 비트 2의 보수로 -199703103을 표시하지만 32 비트 또는 128 비트가 될 수도 있으므로 시작시 다른 수의 0xf가됩니다.

    파이썬의 정수는 임의로 커질 수 있습니다. 원시 2의 보수를 원하는 방식으로 계산하려면 원하는 비트 폭을 지정해야합니다. 귀하의 예는 64 비트 2의 보수로 -199703103을 표시하지만 32 비트 또는 128 비트가 될 수도 있으므로 시작시 다른 수의 0xf가됩니다.

    hex ()는 그렇게하지 않습니다. 대안으로 다음을 제안합니다.

    def tohex(val, nbits):
      return hex((val + (1 << nbits)) % (1 << nbits))
    
    print tohex(-199703103, 64)
    print tohex(199703103, 64)
    

    이 내용은 다음과 같이 인쇄됩니다.

    0xfffffffff418c5c1L
    0xbe73a3fL
    
  2. ==============================

    2.파이썬 정수는 임의로 커지므로 2s 보수 표현에 필요한 비트 수로 변환을 제한하기 위해 값을 마스크해야합니다.

    파이썬 정수는 임의로 커지므로 2s 보수 표현에 필요한 비트 수로 변환을 제한하기 위해 값을 마스크해야합니다.

    >>> hex(-199703103 & (2**32-1)) # 32-bit
    '0xf418c5c1L'
    >>> hex(-199703103 & (2**64-1)) # 64-bit
    '0xfffffffff418c5c1L'
    

    파이썬은 16 진수 (-199703103)의 간단한 경우를 2 진수 값 (-0xbe73a3f)으로 표시합니다. 왜냐하면 2의 보수 표현은 임의의 정밀도 숫자에 대해 무한 수의 F가 앞에 있기 때문입니다. 마스크 값 (2 ** 32-1 == 0xFFFFFFFF)은 다음과 같이 제한합니다.

    FFF...FFFFFFFFFFFFFFFFFFFFFFFFF418c5c1
    &                             FFFFFFFF
    --------------------------------------
                                  F418c5c1
    
  3. ==============================

    3.다른 출력 형식을 원하면 Marks 응답에 추가하십시오.

    다른 출력 형식을 원하면 Marks 응답에 추가하십시오.

    '{:X}'.format(-199703103 & (2**32-1))
    
  4. ==============================

    4.

    >>> import struct
    >>> struct.pack("i", -4)
    '\xfc\xff\xff\xff'
    
  5. from https://stackoverflow.com/questions/7822956/how-to-convert-negative-integer-value-to-hex-in-python by cc-by-sa and MIT license