최신 릴리스: 1.0.0-베타
오버플로 시 래핑되는 정수에 대한 산술 연산을 위한 PHP 5.3+ 라이브러리입니다.
주목
이 라이브러리는 정수에 대한 산술 연산을 올바르게 수행하는 방법으로 사용하기 위한 것이 아니며 기본 산술 연산자나 그러한 목적으로 설계된 다른 라이브러리 대신 사용해서는 안 됩니다.
큰 양의 정수를 큰 음의 정수로 오버플로하는 다른 언어와 달리 PHP는 실제로 정수를 부동 소수점 숫자로 오버플로합니다. 대부분의 경우 산술 오버플로는 특별한 처리가 필요한 비정상적인 상황으로 처리되어야 합니다. 그러나 이러한 순환 동작이 실제로 유용한 경우도 있습니다(예: TCP 시퀀스 번호 또는 해시 계산과 같은 특정 알고리즘의 경우). 이 유틸리티 클래스는 해당 동작에 따라 작동하는 기본 산술 함수를 제공합니다.
설명하기 위해 다음 예를 고려하십시오.
// Output on 64-bit system: float(9.2233720368548E+18)
var_dump ( PHP_MAX_INT + 1 );
// Output on 64-bit system: int(-9223372036854775808)
var_dump (IntMath:: add ( PHP_MAX_INT , 1 ));
이전에 표시된 대로 기본 산술 연산자를 사용하여 지원되는 가장 큰 정수에 1을 추가하면 부동 소수점 숫자가 생성됩니다. 반대로 IntMath::add()를 사용하면 오버플로가 발생하여 이 PHP 빌드에서 지원되는 가장 작은 정수가 생성됩니다.
API는 소스 코드에 광범위하게 문서화되어 있습니다. 또한 브라우저에서 보다 편리하게 볼 수 있도록 HTML 버전도 제공됩니다.
Composer를 사용하여 패키지를 설치합니다.
$ composer require phpcommon/intmath
현재는 네 가지 기본 산술 연산(덧셈, 뺄셈, 곱셈, 나눗셈)과 부정만 지원됩니다.
정수 값의 경우 부정은 0에서 빼는 것과 같습니다. PHP는 정수에 대해 2의 보수 표현을 사용하고 2의 보수 값의 범위가 대칭이 아니기 때문에 최대 음수를 부정하면 동일한 최대 음수가 생성됩니다. 오버플로가 발생했음에도 불구하고 예외는 발생하지 않습니다.
모든 정수 값 $a
의 경우 -$a
(~$a) + 1
과 같습니다.
API 예제 사용법:
// Outputs int(-100)
var_dump (IntMath:: negate ( 100 ));
두 개의 정수를 더한 결과는 충분히 넓은 2의 보수 형식으로 표현되는 실제 수학적 결과의 하위 비트입니다. 오버플로가 발생하면 결과의 부호는 두 값의 수학적 합계의 부호와 동일하지 않을 수 있습니다. 오버플로에도 불구하고 이 경우에는 예외가 발생하지 않습니다.
API 예제 사용법:
// Outputs int(300)
var_dump (IntMath:: add ( 100 , 200 ));
양수를 빼면 크기가 같은 음수를 더하는 것과 같은 결과가 나옵니다. 게다가 0에서 빼는 것은 부정과 같습니다. 결과는 충분히 넓은 2의 보수 형식으로 표현된 실제 수학적 결과의 하위 비트입니다. 오버플로가 발생하면 결과의 부호는 두 값의 수학적 차이의 부호와 동일하지 않을 수 있습니다. 오버플로에도 불구하고 이 경우에는 예외가 발생하지 않습니다.
API 예제 사용법:
// Outputs int(90)
IntMath:: subtract ( 100 , 10 );
두 정수를 곱한 결과는 충분히 넓은 2의 보수 형식으로 표현된 실제 수학적 결과의 하위 비트입니다. 오버플로가 발생하면 결과의 부호는 두 값의 수학적 곱의 부호와 동일하지 않을 수 있습니다. 오버플로에도 불구하고 이 경우에는 예외가 발생하지 않습니다.
API 예제 사용법:
// Outputs int(200)
IntMath:: multiply ( 100 , 2 );
나눗셈은 결과를 0으로 반올림합니다. 따라서 결과의 절대값은 두 피연산자의 몫의 절대값보다 작거나 같은 가능한 가장 큰 정수입니다. 두 피연산자의 부호가 동일하면 결과는 0 또는 양수이고, 두 피연산자의 부호가 반대이면 결과는 0 또는 음수입니다.
이 규칙을 충족하지 않는 특별한 경우가 하나 있습니다. 피제수가 해당 유형에 대해 가능한 가장 큰 크기의 음의 정수이고 제수가 -1
인 경우 정수 오버플로가 발생하고 결과는 피제수와 같습니다. 오버플로에도 불구하고 이 경우에는 예외가 발생하지 않습니다. 반면에 정수 나누기의 제수 값이 0
이면 DivisionByZeroException
이 발생합니다.
API 예제 사용법:
// Outputs int(50)
IntMath:: divide ( 100 , 2 );
최근 변경된 사항에 대한 자세한 내용은 CHANGELOG를 참조하세요.
$ composer test
자세한 내용은 테스트 문서를 확인하세요.
패키지에 대한 기여는 언제나 환영합니다!
자세한 내용은 기여 및 실행을 참조하세요.
보안 관련 문제를 발견한 경우 문제 추적기를 사용하는 대신 [email protected]으로 이메일을 보내주세요.
이 패키지의 모든 콘텐츠는 MIT 라이선스에 따라 라이선스가 부여됩니다.