PHP Manual
后退 | 章 11. 类型 | 前进

# 整型

一个 integer 是集合 Z = {..., -2, -1, 0, 1, 2, ...} 中的一个数。

参见任意长度整数 / GMP，浮点数 和 任意精度数学库 / BCMath。

## 语法

整型值可以用十进制，十六进制或八进制符号指定，前面可以加上可选的符号（- 或者 +）。

如果用八进制符号，数字前必须加上 0（零），用十六进制符号数字前必须加上 0x。

例子 11-1. 整数文字表达
`<?php $a = 1234; # 十进制数 $a = -123; # 一个负数 $a = 0123; # 八进制数（等于十进制的 83） $a = 0x1A; # 十六进制数（等于十进制的 26） ?>`

在字面上，整型变量正式的结构可以为：

    <?php
    decimal     : [1-9][0-9]*
                | 0

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

    octal       : 0[0-7]+

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

整型数的字长和平台有关，尽管通常最大值是大约二十亿（32 位有符号）。PHP 不支持无符号整数。

## 整数溢出

如果你指定一个数超出了 integer 的范围，将会被解释为 float。同样如果你执行的运算结果超出了 integer 范围，也会返回 float。

`<?php $large_number = 2147483647; var_dump($large_number); // 输出为：int(2147483647) $large_number = 2147483648; var_dump($large_number); // 输出为：float(2147483648) // 同样也适用于十六进制表示的整数： var_dump( 0x80000000 ); // 输出为：float(2147483648) $million = 1000000; $large_number = 50000 * $million; var_dump($large_number); // 输出为：float(50000000000) ?>`

警告
不幸的是 PHP 中有个 bug，因此当有负数参与时结果并不总是正确。例如当运算 -50000 * $million 时结果是 -429496728。不过当两个运算数都是正数时就没问题。 这个问题已经在 PHP 4.1.0 中解决了。

PHP 中没有整除的运算符。1/2 产生出浮点数 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() 来将一个值转换成整型。

参见类型戏法。

### 从布尔值转换

`FALSE` 将产生出 0（零），`TRUE` 将产生出 1（壹）。

### 从浮点数转换

当从浮点数转换成整数时，数字将被取整（丢弃小数位）。

如果浮点数超出了整数范围（通常为 +/- 2.15e+9 = 2^31），则结果不确定，因为没有足够的精度使浮点数给出一个确切的整数结果。在此情况下没有警告，甚至没有任何通知！

（译者注：）在 Linux 下返回结果是最小负数（-2147483648），而在 Windows 下返回结果是零（0）。

警告
决不要将未知的分数强制转换为 integer，这样有时会导致意外的结果。
`<?php echo (int) ( (0.1+0.7) * 10 ); // 显示 7！ ?>`
更多信息见浮点数精度。

### 从字符串转换

参见字符串转换为数字。

### 从其它类型转换

注意
没有定义从其它类型转换为整型的行为。目前的行为和值先转换为布尔值一样。不过不要依靠此行为，因为它会未加通知地改变。

后退 | 起点 | 前进
布尔型 | 上一级 | 浮点型