PHP 매뉴얼
이전 | 6. 장. 변수형 | 다음

# 정수

integer는 거대한 집합 Z = {..., -2, -1, 0, 1, 2, ...}이다.

Arbitrary length integer / GMP, 부동 소수점수, Arbitrary precision / BCMath를 참고

## 문법

정수는 10진수(10-based), 16진수(16-based), 8진수(8-based) 표기법으로 표현 될수 있다. 선택적으로 부호 (- 나 +)를 사용할수 있다.

8진수 표기법을 사용하면, `0` (zero)를 숫자의 앞에 붙여야 하며, 16진수 표기하려면 `0x`을 숫자 앞에 붙이도록 한다.

예 6-1. 정수 리터럴

`<?php $a = 1234; # decimal number $a = -123; # a negative number $a = 0123; # octal number (equivalent to 83 decimal) $a = 0x1A; # hexadecimal number (equivalent to 26 decimal) ?>`

공식적으로 가능한 정수 리터럴의 구조는 다음과 같다:

    decimal     : [1-9][0-9]*
                | 0

    hexadecimal : 0[xX][0-9a-fA-F]+

    octal       : 0[0-7]+

    integer     : [+-]?decimal
                | [+-]?hexadecimal
                | [+-]?octal

약 20억을 최대값(부호가 있는 32비트)으로 사용할수 있을지라도, 정수의 크기는 플랫폼에 따라 달라지게 된다. PHP는 부호없는(unsigned) 정수 를 지원하지 않는다.

## 정수 오버플로우

정수타입의 범위를 넘는 수를 사용하려면 그 값은 대신 float타입으로 해석될 것이다. 또한, 결과값이 integer타입의 범위를 초과하게 되는 작업을 수행되면, 그 값은 대신 float으로 돌려줄것이다.

`<?php $large_number = 2147483647; var_dump($large_number); // output: int(2147483647) $large_number = 2147483648; var_dump($large_number); // output: float(2147483648) // this goes also for hexadecimal specified integers: var_dump( 0x80000000 ); // output: float(2147483648) $million = 1000000; $large_number = 50000 * $million; var_dump($large_number); // output: float(50000000000) ?>`

주의
불운하게도, PHP는 버그로 인해 음수와 연계될때 정확하게 동작하지 않을수 있다. 예를 들면 `-50000 * $million`를 수행하면, 결과는 `-429496728`이 될것이다. 두 피연산자가 모두 양수이면 아무 문제가 없다. 이 문제는 PHP 4.1.0에서 해결되었다.

PHP에는 정수 나누기 연산자가 없다. `1/2`는 float `0.5`가 된다. 반올림하기 위해 정수로 값을 캐스트하거나, round() 함수를 쓸수 있다.

`<?php var_dump(25/7); // float(3.5714285714286) var_dump((int) (25/7)); // int(3) var_dump(round(25/7)); // float(4) ?>`

## 정수로 변환하기

명시적으로 integer로 변환하려면 `(int)`나 `(integer)` 캐스트를 사용한다. 하지만, 대부분의 경우 이런 캐스트를 사용할 필요가 없다. 왜냐하면 연산자 나 함수 또는 제어 구조가 integer 인수를 요구한다면 자동으로 변환되기 때문이다. 또한 intval()함수로 정수값으로 변환할수 있다.

See also type-juggling.

### 논리값에서

`FALSE`는 `0` (zero), 그리고 `TRUE`는 `1` (one).

### 부동소수점수에서

float에서 integer로 변환할때, 그 수는 0으로 깍일것이다.

float이 integer범위를 초과하면 (주로 `+/- 2.15e+9 = 2^31`), 결과는 정의되지않는다. 왜냐하면 float은 정확한 정수값을 돌려주기에 충분한 정밀도를 갖지 않기 때문이다. 이 경우에는 warning이나 notice조차도 나타나지 않는다!

주의

알려지지 않은 소수를 integer로 캐스트하지 말것, 왜냐하면 이렇게 하는경우에 종종 기대하지 않는 결과를 유도할수 있기 때문이다.

`<?php echo (int) ( (0.1+0.7) * 10 ); // echoes 7! ?>`

자세한 정보는 부동-정밀도에 관한 경고를 참고.

### 문자열로부터

문자열을 숫자로 변환하기를 참고

### 다른 타입으로부터

경고
정수로의 변환은 다른 타입에 대해 정의되지 않는다. 현재까지는 값이 논리값으로 변환될때와 동일하게 동작한다. 하지만, 경고 없이 변할수 있기 때문에 이 동작에 연관짓지 말것

이전 | 처음으로 | 다음
논리값 | 위로 | 부동소수점