본문 바로가기
정보/IT

[javascript/HexToDec]16진수 계산 [parseInt("0x8001001B", 16) - 0xffffffff - 1;]

by 키운씨 2014. 6. 27.




 


예전 포스팅에서 이해하지 못한 연산식을 시간을 들여 해석해 보았다.

parseInt("16진수문자열", 16) - 0xffffffff - 1; 는 과연 무슨 뜻일까?...

위의 식은 parseInt 함수가 가진 특징과 javascript 의 진수 연산의 특징도 포함하고 있고 Signed, Unsigned에 대한 부분도 내포하고 있다.


가장 중요한 것은 parseInt 함수의 결과는 Unsigned 이다.

Unsigned 와 Signed 에 대해 알고 싶다면 다음의 링크 참조 -> Signed,  Unsigned

그래서 parseInt("0x8001001B", 16) 를 실행하면 결과값이 10진수 Unsigned 값인 2147549211 으로 나온다.


그렇다면 2147549211 - 0xffffffff 는 어떤 결과가 나올까? 10진수 에서 16진수를 빼고 있다.

javascript 는 위의 연산에서 16진수를 자동으로 10진수로 변환시킨다.

parseInt("0xffffffff", 16) 는 (Unsigned)4294967295 인데 다음과 같음을 알 수 있다.

2147549211 - 0xffffffff == 2147549211 - 4294967295 == -2147418084


그럼 마지막에 1을 빼는 이유는 무엇일까?

사실은 parseInt("0x8001001B", 16) - 0xffffffff - 1 식은 원래 parseInt("0x8001001B", 16) - (0xffffffff + 1) 이다.

그것은 위의 식은 원래 Unsigned 값을 Signed 로 변환하기 위한 연산이라는 것을 의미한다.

(0xffffffff + 1) 는 16진수 Unsigned 의 범위를 구하기 위해 +1 을 하면 4294967296 라는 값이 나온다.

그리고 parseInt("0x8001001B", 16) 의 결과로 나온 (Unsigned)2147549211 에서 4294967296 을 뺌으로써 Signed 값을 구할 수 있는 것이다.


처음엔 양수가 음수가 되길래 2의 보수와 관계가 있겠구나해서 보수와의 연관성으로 분석했었는데 사실은 Signed, Unsigned와 관계가 있었다는 것을 알게 되었다.


그렇다고 보수와 아무 관계가 없다는 것은 아니다.

0xffffffff 의 Signed 값은 -1 이기 때문이다. 관련 URL -> 0xffffffff의 값은 왜 -1인가?


그래서 0xffffffff + 1 은 (Unsigned)4294967296 인데 이것을 Signed로 바꾸면 0이 된다.

'정보 > IT' 카테고리의 다른 글

PC 와 Mobile 플랫폼을 웹앱으로 통일한다  (0) 2016.12.18
Data-Driven Documents (D3.js)  (0) 2014.10.24
Javascript parseInt 함수  (0) 2014.06.27
VisualSVN 서버로 Subversion 서버 구동하기  (0) 2013.04.09
ActiveX 와 보안  (0) 2012.07.14