2.1.2 오버플로(Overflow)
2.1.2 오버플로(Overflow)
성능상의 이유로 Haxe 컴파일러는 어떤 오버플로 동작도 강제하지 않아요. 오버플로 확인의 부담은 대상 플랫폼에 달려 있답니다. 오버플로 동작에 대한 플랫폼별 참고 사항은 다음과 같습니다:
- C++, Java, C#, Neko, Flash: 일반적인 오버플로 관행을 따르는 32비트 부호 있는 정수
- PHP, JS, Flash 8: 네이티브
Int타입이 없으며, 숫자가 float 한계(2의 52제곱)에 도달하면 정밀도 손실이 발생
대안으로 haxe.Int32와 haxe.Int64 클래스를 사용하면 정확한 오버플로 동작을 보장할 수 있어요. 다만 특정 플랫폼에서는 추가 계산 비용이 발생합니다.
출처: Overflow
본문
오버플로 동작의 플랫폼 차이
Haxe는 여러 대상 플랫폼으로 컴파일되므로, 정수 오버플로의 동작도 플랫폼별로 달라져요. C++, Java, C#, Neko, Flash 같은 정적 대상은 32비트 부호 있는 정수를 사용하며 각 언어의 일반적인 오버플로 관행을 따릅니다.
반면 JavaScript, PHP, Flash 8 같은 동적 대상에는 네이티브 Int 타입이 없어요. 이 플랫폼들은 숫자를 배정밀도 부동소수점으로 다루기 때문에, 값이 2의 52제곱을 넘어서면 정밀도 손실이 발생할 수 있답니다.
안정적인 오버플로 처리
정확한 오버플로 동작이 중요하다면 haxe.Int32나 haxe.Int64 클래스를 사용하는 것이 좋아요. 이 클래스들은 명시적인 32비트/64비트 정수 계산을 제공하며, 대상 플랫폼의 일반 정수보다 오버플로를 예측 가능하게 처리해 줍니다. 다만 일부 플랫폼에서는 추가적인 계산 비용이 들 수 있어요.