Forum und email

정수

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을 숫자 앞에 붙이도록 한다.

Example#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_dump0x80000000 );
// output: float(2147483648)

$million 1000000;
$large_number =  50000 $million;
var_dump($large_number);
// output: float(50000000000)
?>
Warning

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

이 문제는 PHP 4.1.0에서 해결되었다.

PHP에는 정수 나누기 연산자가 없다. 1/2float 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.

논리값에서

FALSE0 (zero), 그리고 TRUE1 (one).

부동소수점수에서

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

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

Warning

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

<?php
echo (int) ( (0.1+0.7) * 10 ); // echoes 7!
?>
자세한 정보는 부동-정밀도에 관한 경고를 참고.

문자열로부터

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

다른 타입으로부터

Caution

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