-
Notifications
You must be signed in to change notification settings - Fork 0
Description
궁금한 점
What:
JavaScript의 number가 0과 -0을 "왜" 지원하는지, 그리고 "어떻게" 지원하는지 궁금하다.
Why:
JavaScript - number를 공부하면서 JavaScript.info - number 자료를 통해 두 종류의 0 이라는 내용을 보게 되었다. 그 내용은 다음의 callout과 같다.
Note
자바스크립트 내부에서 숫자를 표현하는 방식 때문에 발생하는 또 다른 흥미로운 현상은 0과 -0이라는 두 종류의 0이 존재한다는 사실입니다.
자바스크립트에선 숫자의 부호가 단일 비트에 저장되는데 0을 포함한 모든 숫자에 부호를 설정할 수도, 설정하지 않을 수도 있기 때문입니다.
대부분의 연산은 0과 -0을 동일하게 취급하기 때문에 두 0의 차이는 두드러지지 않는 편입니다.
위 note를 보고 0을 지원하는 건 그렇다고 치는데 -0을 왜(어떤 맥락에 의해) 지원할 필요가 있었으며, 그리고 어떻게 지원하는 지에 대한 궁금증이 생겼다.
추측해보기
What I Already Know:
이전에 대학 강의로 들었던 프로그래밍 기초 과목에서 배운 C언어의 number 저장 관련 메모리 지식을 살려보면 숫자는 메모리에 다음과 같이 저장된다고 기억한다.
12345라는 값을 short를 통해 저장하는 예제이다.
1. 양수 short 값 저장 시 2진수
예제: short num = 12345;
12345의 16비트 2진수 표현:0011 0000 0011 1001
2. 음수 short 값 저장 시 2진수 (2의 보수 변환)
예제: short num = -12345;
- 양수 12345의 16비트 2진수:
0011 0000 0011 1001 - 1의 보수 (비트 반전):
1100 1111 1100 0110 - +1을 더한 2의 보수:
1100 1111 1100 0111
요약
12345는 2진수로0011 0000 0011 1001로 저장.-12345는 2의 보수 방식으로1100 1111 1100 0111로 저장.
Preliminary Thoughts:
위 방식을 기준으로 해서 값을 표현해본다면,
8bit에서 숫자 0를 0000 0000이라 할 때, -0 또한 2의 보수(1111 1111)에 1을 더한 0000 0000이 될 것이다.
즉, 메모리 상 표현 방식이 완전히 똑같기 때문에 이 둘을 구분할 수가 없다.
하지만 C언어의 숫자형과 js의 number 사이에는 큰 차이가 있다. 바로 c언어는 정수형과 실수형을 나누지만 js에서는 number로 실수와 정수를 둘 다 표현한다는 것이다.
즉, js의 number는 부동소수점을 가질 것이다. 따라서, 정수형 데이터보다는 실수형 데이터 메모리 형태 구조를 따를 것으로 예상한다.
간단하게 말하면, 0과 -0은 실제론 C언어의 0.0과 -0.0의 차이지 않을까 생각한다.
Note
최종 가설:
- number는 정수형과 실수형을 구분하지 않고 모든 숫자를 부동소수점을 고려하여 메모리 상에 저장할 것이다.
Checklist: Essential Guidelines to Verify Before Posting
- Clear Title: 제목이 문제의 핵심을 명확하고 간결하게 요약하고 있나요?
- Detailed Background: 문제의 배경, 학습 동기, 현재 이해한 내용을 충분히 설명하였나요?
- Reproducible Example (if applicable): 코드나 재현 가능한 예제가 필요한 경우, 최소한의 예제를 포함하였나요?
- Readability: 질문이 읽기 쉽도록 헤더, 목록, 코드 블록 등을 적절히 사용하였나요?