sitelink1 http://blog.naver.com/tomatoalive?Redire...0116358702 
sitelink2  
sitelink3  
sitelink4 http://1 
extra_vars4 ko 
extra_vars5  
extra_vars6 sitelink1 
자바스크립트에서 숫자형은 크기를 지정할 수가 없습니다. 8bit char 형 이라던가 32bit int 형 이라던가 하는것들 말입니다. 개발자 입장에서는 잘 쓰면 그만인 것이지만 조금만 자세히 들여다 보면 여간 신기한 것이 아닙니다. 그것은 바로 음수 때문인데요, 잘 아시는 바와 같이 signed char 의 첫번째 Bit 는 숫자의 부호를 뜻하며 1이면 음수이고 0이면 양수입니다.
 
자 그렇다면... 0xff 0xffff 0xffffffff 는 모두 -1 입니까? 설마요... 안타깝게도 자바스크립트에서는 signed, unsigned 구분을 임의로 할수가 없기 때문에 어떤 규칙을 만들어야 했을겁니다. 한번 살펴 보도록 하죠.
 
제가 64비트 운영체제에서 자바스크립트를 실행해 본 경험이 없어서 단언하기는 어렵습니다만, 일단 32비트 운영체제에서는 비트연산 과정에서 32비트중 첫번째 비트가 1이 되면 음수입니다. 그런데 비트연산이 아닌 더하기와 곱하기로 인한 결과인 경우에는 음수가 아닙니다. 어찌보면 당연한 것이죠. 사칙 연산은 비트들을 직접 건드린다기 보다 다른 공간에서 계산한 결과를 보여주는 것이라고 생각합니다. 비트연산이 빠른 이유도 그런것 아니겠습니까?
 
이제 c 언어에서는 볼수 없었던 >>> (Unsigned Right Shift) 연산자가 등장하게 됩니다. ㄷㄷㄷ. 이건 뭔가요. 반대로 >> 연산자는 어떻게 다른건가요? c 언어에 익숙한 개발자들에게 치명적인 실수를 유도할지도 모르는 중요한 대목입니다. 제가 이 글을 포스팅 하게 된 이유이기도 하구요.
 
>>> (Unsigned Right Shift) 부호를 무시하고 비트를 오른쪽으로 이동시킵니다. (= 비트 이동후 0으로 채웁니다.)
 
>> (Signed Right Shift) 부호를 유지하여 비트를 오른쪽으로 이동시킵니다. (= 음수는 1로 채우고 양수는 0으로 채웁니다.)
 
0xFF 는 음수가 아닌 255 지만, -1 은 0xFF 입니다. 이상하죠? 사실은 -1은 0xFFFFFFFF 입니다. -255 는 signed char 에서는 나올수 없는 값이고 signed short 에서는 0xFF01 입니다. 32비트 signed int 에서는 0xFFFFFF01 입니다. 어떤 의미이냐 하면 음수인 경우에는 형을 크게 하더라도 항상 1로 채워진다는 의미 입니다. Signed Right Shift 에서 음수는 1로 채운다는 것을 설명하는 것입니다.
 
-1은 어떨까요? -1은 어떤 경우라도 모든 비트가 1 이므로 >> n 에서 n 의 값에 관계없이 항상 -1 입니다. 32비트를 넘어서면 비트연산의 의미가 없습니다. 마지막으로 이 점도 유의 해야 겠습니다. 0x8080000000 과 0x80000000 은 다른 값이지만 비트연산을 하면 같은 값입니다.
 
(0xFF80000000>>1 == 0x80000000>>1)? true 4바이트를 넘어서는 FF 는 무시되기 때문입니다.
(0xFF80000000 == 0x80000000)? false 두 수 모두 양수이고 앞의 값이 뒤의 값보다 큽니다.
 
사실 자바스크립트에서 비트연산을 한다는것은 매우 이례적인 일이기 때문에 논하는 자체가 부담일 수 있습니다. 하지만 속도에 욕심이 있는 개발자라면 알고 사용하는것이 좋겠죠~
번호 제목 글쓴이 날짜 조회 수
» 자바스크립트의 쉬프트 연산자 (Shift Operator) 와 음수 (Negative) 이야기 황제낙엽 2012.05.31 726
156 연산자 (===, ==, >=, <=) 황제낙엽 2012.05.30 47
155 XMLHttpRequest 의 이벤트 onreadystatechange 황제낙엽 2012.05.30 412
154 JavaScript 재입문 황제낙엽 2012.05.29 50
153 진행 상황 추적하기(XMLHttpRequest.readyState) file 황제낙엽 2012.05.23 324
152 JavaScript Touch and Gesture Events iPhone and Android 황제낙엽 2012.04.12 337
151 Javascript ArrayBuffer ? Binary handling in javascript 황제낙엽 2012.03.19 218
150 오류:호출자(서버 응용 프로그램이 아닌 서버)가 사용될 수 없어서 사라졌습니다. file 황제낙엽 2012.03.14 1950
149 Alert 에서의 개행처리 황제낙엽 2012.03.09 80
148 env.js 사용시 부족한 부분 file 황제낙엽 2012.02.15 33
147 Rhino 와 env.js 를 사용해서 자바 서버에서 javascript 를 구동해보자 file 황제낙엽 2012.02.15 116
146 외부 라이브러리 (.js) 의 바람직하지 않은 동적 로딩 (eval함수 이용) 황제낙엽 2012.01.18 1851
145 IFrames and cross-domain security file 황제낙엽 2012.01.13 246
144 자바스크립트 숫자형 체크 함수 (isFinite() 함수 와 isNaN() 함수) 황제낙엽 2011.12.13 67
143 char to hex string 황제낙엽 2011.11.29 206
142 Understanding delete 황제낙엽 2011.11.28 61
141 JScript Memory Leaks 황제낙엽 2011.11.28 69
140 JavaScript Reserved Words 황제낙엽 2011.11.28 94
139 Reference Count (순환참조) 황제낙엽 2011.11.24 191
138 IE and Memory accumulation in Javascript (document.createElement()) file 황제낙엽 2011.11.24 30