예전 포스팅에서 이해하지 못한 연산식을 시간을 들여 해석해 보았다.
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 |