자바스크립트에서의 2147483647 + 1
자바스크립트에서 숫자는 IEEE 754 표준을 따르는 부동 소수점 형식으로 표현되며, 모든 숫자는 배정밀도(double precision) 64비트 형식으로 저장됩니다. 이러한 표현 방식은 정수와 부동 소수점 수 모두를 포괄하며, 큰 정수 값도 정밀하게 표현할 수 있습니다. 따라서 자바스크립트에서 2147483647 (2^31 - 1, int 타입의 최대값)에 1을 더하면 정확히 **2147483648**이 됩니다.
2147483647 + 1; // 2147483648
자바에서의 2147483647 + 1
자바에서는 숫자 타입이 고정 너비를 가집니다. int 타입은 32비트 정수를 저장하며, 이는 -2^31부터 2^31 - 1까지의 범위를 가집니다. 따라서 **2147483647**은 int 타입으로 표현할 수 있는 최대값입니다. 이 값에 1을 더하면 오버플로가 발생하여, 가장 작은 int 값인 -2^31로 롤오버(roll over)됩니다. 이는 -2147483648이 됩니다.
2147483647 + 1; // -2147483648
이러한 차이는 자바스크립트와 자바에서 사용되는 숫자의 내부 표현 방식과 데이터 타입의 범위가 다르기 때문에 발생합니다. 자바스크립트는 보다 유연한 숫자 표현을 제공하는 반면, 자바는 타입에 따라 엄격한 범위와 오버플로 동작을 가집니다.
자바스크립트에서 큰 정수의 처리
자바스크립트에서는 모든 숫자가 IEEE 754 표준에 따른 배정밀도(double precision) 64비트 부동 소수점 형식으로 표현됩니다. 이는 자바스크립트가 64비트 정수를 정확히 표현할 수 없다는 것을 의미하는데, 이는 부동 소수점 형식이 정수와 실수 모두를 표현하기 위해 설계되었기 때문입니다. 부동 소수점 형식에서는 가수부(mantissa)가 52비트를 차지하고, 나머지 비트는 지수부와 부호비트에 할당됩니다. 따라서, 가수부를 사용해 표현할 수 있는 가장 큰 정수는 253253 - 1입니다. 이보다 큰 정수는 정확도를 잃게 됩니다.
그러나 자바스크립트는 **BigInt**라는 데이터 타입을 도입하여 이 문제를 해결했습니다. BigInt는 임의 정밀도를 가진 정수를 표현할 수 있으며, 기본적인 숫자 타입(Number)으로 표현할 수 없는 매우 큰 정수 값을 다룰 때 사용됩니다. **BigInt**를 사용하면, 64비트 이상의 정수도 정확하게 표현하고 연산할 수 있습니다.
BigInt 사용 예시
const bigIntValue = 1234567890123456789012345678901234567890n;
BigInt 리터럴은 숫자 뒤에 **n**을 붙여서 표현합니다. **BigInt**는 일반적인 수학 연산자를 사용하여 연산할 수 있으나, **BigInt**와 Number 타입 간의 연산에서는 타입을 명시적으로 변환해야 할 수도 있습니다. **BigInt**와 **Number**는 서로 다른 타입이므로, 직접적인 비교나 연산을 시도할 때 타입 에러가 발생할 수 있습니다.
따라서 자바스크립트에서는 64비트 정수를 **BigInt**를 통해 정확하게 다룰 수 있으며, 이는 큰 정수를 필요로 하는 애플리케이션에 매우 유용합니다.
숫자 리터럴
자바스크립트에서 숫자 리터럴(Number Literals)은 소스 코드 내에서 숫자 값을 직접 표현하는 방법입니다. 숫자 리터럴은 다양한 형식을 가지며, 정수, 부동 소수점 수, 16진수, 8진수, 2진수 및 BigInt(아주 큰 정수) 값을 표현할 수 있습니다. 이러한 다양한 형식은 자바스크립트가 다양한 수치 데이터를 효율적으로 처리할 수 있도록 해줍니다.
주요 숫자 리터럴 형식
1. 십진수 리터럴 (Decimal Literals)
- 정수: 10
- 부동 소수점 수: 10.5, .99, 3.14e2 (3.14 × 10^2)
2. 이진수 리터럴 (Binary Literals)
- 0b 또는 **0B**로 시작합니다.
- 예: 0b101 (십진수로 5)
3. 8진수 리터럴 (Octal Literals)
- ES6부터는 0o 또는 **0O**로 시작하는 형식을 사용합니다.
- 예: 0o10 (십진수로 8)
4. 16진수 리터럴 (Hexadecimal Literals)
- 0x 또는 **0X**로 시작합니다.
- 예: 0xFF (십진수로 255)
5. BigInt 리터럴
- 아주 큰 정수를 표현하기 위해 사용되며, 숫자 뒤에 **n**을 붙입니다.
- 예: 9007199254740991n
숫자 리터럴의 특징
- 정밀도: 부동 소수점 리터럴은 IEEE 754 표준을 따르며, 이는 무한대(Infinity), 음의 무한대(Infinity), 그리고 '숫자가 아님'(NaN) 값을 포함할 수 있습니다.
- 큰 수 처리: BigInt 리터럴은 정밀도 손실 없이 아주 큰 정수를 안전하게 처리할 수 있게 해줍니다. 이는 금융 계산이나 고유 식별자 처리에 유용합니다.
- 리터럴 표현: 이진수, 8진수, 16진수 리터럴은 주로 데이터 표현, 비트 연산 등 특수한 경우에 사용됩니다.
예제
let decimal = 42; // 십진수 리터럴
let float = 3.14; // 부동 소수점 리터럴
let binary = 0b1010; // 이진수 리터럴
let octal = 0o52; // 8진수 리터럴
let hex = 0x2A; // 16진수 리터럴
let bigInt = 1234567890123456789012345678901234567890n; // BigInt 리터럴
자바스크립트에서 숫자 리터럴을 사용하는 것은 프로그래밍에서 흔히 발생하는 다양한 수치 연산을 수행하기 위한 기본적이면서도 강력한 방법입니다. 이를 통해 개발자는 다양한 숫자 형식을 효율적으로 처리할 수 있습니다.
'javascript > 자바스크립트는 왜 그 모양일까' 카테고리의 다른 글
불(boolean) 타입 (1) | 2024.03.05 |
---|---|
자바스크립트에서의 큰 유리수 (1) | 2024.03.05 |
큰 부동소수점 (0) | 2024.03.05 |
자바스크립트에서의 큰 정수 (0) | 2024.03.05 |
자바스크립트에서의 0 (0) | 2024.02.10 |