궁금한 점
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;
2. 음수 short 값 저장 시 2진수 (2의 보수 변환)
예제: short num = -12345;
양수 12345의 16비트 2진수 :
1의 보수 (비트 반전) :
+1을 더한 2의 보수 :
요약
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
궁금한 점
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진수 표현:2. 음수
short값 저장 시 2진수 (2의 보수 변환)예제:
short num = -12345;요약
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
최종 가설:
Checklist: Essential Guidelines to Verify Before Posting