Skip to content

JavaScript의 number는 왜 0과 -0을 지원하는가? #3

@luke0408

Description

@luke0408

궁금한 점

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;

  1. 양수 12345의 16비트 2진수:
    0011 0000 0011 1001
    
  2. 1의 보수 (비트 반전):
    1100 1111 1100 0110
    
  3. +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: 질문이 읽기 쉽도록 헤더, 목록, 코드 블록 등을 적절히 사용하였나요?

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions