본문 바로가기

프로그래밍/javascript(ES)

자바스크립트 32 비트 정수 구조, 음수 int

자바스크립트에 사용되는 타입들 중에서 우리가 흔히 말하는 '정수'는 number입니다. C와 같은 시스템 계열 언어들은 대부분 값의 범위가 정해져 있고 소수점도 정해져있을 뿐더러 변수 하나를 계속 동적으로 바꾸는 일도 생각보다 힘듭니다. 하지만 JS는 그런 언어들이랑 거리가 멀기에 사실 동적으로 크기도 바뀌고, 소수도 마음대로 넣을 수 있으며 최대 범위도 엄청나게 크기에(최대크기 실험 링크), 사실상 거의 제한이 없다고 보면 되는데요.


하지만 이런 JS도 이 연산을 할때 만큼은 형식이 아주 제한적으로 바뀝니다. 바로 "비트 연산" 이죠. 그럼, 비트 연산에서 사용되는 정수형인 32비트 정수의 구조를 알아봅시다.



32비트 정수 구조

먼저 당연하지만 기본 구조는 2진수 형식(2진수는 여기에서)을 띠고 있습니다. 32비트, 즉 4바이트이고 메모리의 4칸을 필요로 합니다.

32비트면, 0과 1들이 32개 있다는 겁니다!


▲ 0을 봤더니 양파링이 먹고 싶어졌습니다.

이런식으로 0 또는 1이 나열되어 있습니다. 우리가 이곳에다가 7을 넣는다면, 마지막에 써있는 세 자리가 "111"로 바뀌게 되는 것입니다. 그렇게 되면, 변수의 값이 변했다고 말할수 있죠.

그런데, 여기에서 조금 의문이 드는 점 하나가 생깁니다. 우리는 분명 C에서 int 형을 쓸때조차도, 음수를 변수에 충분히 저장할 수 있었는데.. 이런식으로 되어있는 32개의 비트에서 '음수'를 표현하려면 어떻게 해야 될까요? 대체 어떻게 해야지 우리가 생각하는 0보다 작은 수 음수를 표현할수 있을까요?


가장 앞 비트의 비밀

int형 음수에는 32비트 정수에서 가장 앞에 있는 비트와 깊은 관련이 있는데요. 가장 앞에 있는 첫번째 비트의 역할로는 2의 31제곱인 2147483648을 나타내는 것이 아닌, 그 값이 음수가 된 '-2147483648' 을 나타내는 것입니다. 그렇기에 int형의 최대값도 2147483647가 되버린 것이죠.

이런 규칙을 적용해봤을때, 만약 2진수 비트들이 모두다 1이라면 숫자는 -1이 되겠죠. 왜냐하면, -2147483648 에다가 그보다 작은 2진수 단위들을 다 더한 (32비트 정수 최대값) 2147483647을 더하니 말이죠. 우리는 이런식으로 가장 앞 비트를 건드려 양, 음수를 표현할 수 있습니다.

▲ 32비트 정수의 특징

오해하면 안될 것

하지만 이렇게 오해하면 안됩니다. 맨 앞 비트를 바꾸면 양/음이 정해진다. 이것은 정말 위험한 오해입니다. 맨 앞 비트는 -2147483648를 의미하기에, 첫번째 비트를 바꿨다고 음양이 정해지는 것이 아닙니다. 뒤에 비트들을 뒤집고 1만큼 추가하는 과정 없이는.. 전혀 다른 수가 나올 뿐입니다. 그리고 이걸 알아두어야 되는데, 아무리 뒤에 따르는 31개의 비트들이 많이 더해봐야 -1까지밖에 못 갑니다. 그렇기에 만약 일반 2진수를 32비트 2진수로 음양을 바꿔 표현을 할 때는, +1을 해줄 필요가 있습니다.

이정도만 주의해주면 끝!


이번 글에서는 딱히 그렇게 복잡한 뭔가를 설명하기보다는, 32비트 정수의 구조에 대해 간단히 설명했습니다. 어째서 최대값이 저렇게 정해지는지, 그리고 생각할 때에 주의해야 할 점 정도를 제 나름대로 간단하게 정리하여 봤습니다. 그럼 글은 여기서 마치도록 하고, 다음에도 알찬 포스트로 돌아오겠습니다. 그럼 안녕!