<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >整型</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="PHP 手册" HREF="index.html"><LINK REL="UP" TITLE="类型" HREF="language.types.html"><LINK REL="PREVIOUS" TITLE="布尔型" HREF="language.types.boolean.html"><LINK REL="NEXT" TITLE="浮点型" HREF="language.types.float.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="sect1" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >PHP 手册</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="language.types.boolean.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" >章 11. 类型</TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="language.types.float.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="sect1" ><H1 CLASS="sect1" ><A NAME="language.types.integer" >整型</A ></H1 ><P > 一个 <A HREF="language.types.integer.html" ><B CLASS="type" >integer</B ></A > 是集合 Z = {..., -2, -1, 0, 1, 2, ...} 中的一个数。 </P ><P > 参见<A HREF="ref.gmp.html" >任意长度整数(GMP)</A >,<A HREF="language.types.float.html" >浮点数</A >和<A HREF="ref.bc.html" >任意精度数学库(BCMath)</A >。 </P ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.types.integer.syntax" >语法</A ></H2 ><P > 整型值可以用十进制,十六进制或八进制符号指定,前面可以加上可选的符号(- 或者 +)。 </P ><P > 如果用八进制符号,数字前必须加上 <TT CLASS="literal" >0</TT >(零),用十六进制符号数字前必须加上 <TT CLASS="literal" >0x</TT >。 <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN2850" ></A ><P ><B >例 11-1. 整数文字表达</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$a </font><font color="#007700">= </font><font color="#0000BB">1234</font><font color="#007700">; </font><font color="#FF8000">// 十进制数<br /></font><font color="#0000BB">$a </font><font color="#007700">= -</font><font color="#0000BB">123</font><font color="#007700">; </font><font color="#FF8000">// 一个负数<br /></font><font color="#0000BB">$a </font><font color="#007700">= </font><font color="#0000BB">0123</font><font color="#007700">; </font><font color="#FF8000">// 八进制数(等于十进制的 83)<br /></font><font color="#0000BB">$a </font><font color="#007700">= </font><font color="#0000BB">0x1A</font><font color="#007700">; </font><font color="#FF8000">// 十六进制数(等于十进制的 26)<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > 在字面上,整型变量正式的结构可以为: <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN2853" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="programlisting" >decimal : [1-9][0-9]* | 0 hexadecimal : 0[xX][0-9a-fA-F]+ octal : 0[0-7]+ integer : [+-]?decimal | [+-]?hexadecimal | [+-]?octal</PRE ></TD ></TR ></TABLE ><P ></P ></DIV > 整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。PHP 不支持无符号整数。 </P ><DIV CLASS="warning" ><P ></P ><TABLE CLASS="warning" BORDER="1" WIDTH="100%" ><TR ><TD ALIGN="CENTER" ><B >警告</B ></TD ></TR ><TR ><TD ALIGN="LEFT" ><P > 如果向八进制数传递了一个非法数字(即 8 或 9),则后面其余数字会被忽略。 <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN2857" ></A ><P ><B >例 11-2. 八进制数的怪事</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />var_dump</font><font color="#007700">(</font><font color="#0000BB">01090</font><font color="#007700">); </font><font color="#FF8000">// 010 octal = 8 decimal<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ></TD ></TR ></TABLE ></DIV ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.types.integer.overflow" >整数溢出</A ></H2 ><P > 如果给定的一个数超出了 <A HREF="language.types.integer.html" ><B CLASS="type" >integer</B ></A > 的范围,将会被解释为 <A HREF="language.types.float.html" ><B CLASS="type" >float</B ></A >。同样如果执行的运算结果超出了 <A HREF="language.types.integer.html" ><B CLASS="type" >integer</B ></A > 范围,也会返回 <A HREF="language.types.float.html" ><B CLASS="type" >float</B ></A >。 <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN2867" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$large_number </font><font color="#007700">= </font><font color="#0000BB">2147483647</font><font color="#007700">;<br /></font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$large_number</font><font color="#007700">);<br /></font><font color="#FF8000">// 输出为:int(2147483647)<br /><br /></font><font color="#0000BB">$large_number </font><font color="#007700">= </font><font color="#0000BB">2147483648</font><font color="#007700">;<br /></font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$large_number</font><font color="#007700">);<br /></font><font color="#FF8000">// 输出为:float(2147483648)<br /><br />// 同样也适用于十六进制表示的整数:<br /></font><font color="#0000BB">var_dump</font><font color="#007700">( </font><font color="#0000BB">0x80000000 </font><font color="#007700">);<br /></font><font color="#FF8000">// 输出为:float(2147483648)<br /><br /></font><font color="#0000BB">$million </font><font color="#007700">= </font><font color="#0000BB">1000000</font><font color="#007700">;<br /></font><font color="#0000BB">$large_number </font><font color="#007700">= </font><font color="#0000BB">50000 </font><font color="#007700">* </font><font color="#0000BB">$million</font><font color="#007700">;<br /></font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$large_number</font><font color="#007700">);<br /></font><font color="#FF8000">// 输出为:float(50000000000)<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > <DIV CLASS="warning" ><P ></P ><TABLE CLASS="warning" BORDER="1" WIDTH="100%" ><TR ><TD ALIGN="CENTER" ><B >警告</B ></TD ></TR ><TR ><TD ALIGN="LEFT" ><P > 不幸的是 PHP 中有个 bug,因此当有负数参与时结果并不总是正确。例如当运算 <TT CLASS="literal" >-50000 * $million</TT > 时结果是 <TT CLASS="literal" >-429496728</TT >。不过当两个运算数都是正数时就没问题。 </P ><P > 这个问题已经在 PHP 4.1.0 中解决了。 </P ></TD ></TR ></TABLE ></DIV > </P ><P > PHP 中没有整除的运算符。<TT CLASS="literal" >1/2</TT > 产生出 <A HREF="language.types.float.html" ><B CLASS="type" >float</B ></A > <TT CLASS="literal" >0.5</TT >。可以总是舍弃小数部分,或者使用 <A HREF="function.round.html" ><B CLASS="function" >round()</B ></A > 函数。 <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN2879" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />var_dump</font><font color="#007700">(</font><font color="#0000BB">25</font><font color="#007700">/</font><font color="#0000BB">7</font><font color="#007700">); </font><font color="#FF8000">// float(3.5714285714286)<br /></font><font color="#0000BB">var_dump</font><font color="#007700">((int) (</font><font color="#0000BB">25</font><font color="#007700">/</font><font color="#0000BB">7</font><font color="#007700">)); </font><font color="#FF8000">// int(3)<br /></font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">round</font><font color="#007700">(</font><font color="#0000BB">25</font><font color="#007700">/</font><font color="#0000BB">7</font><font color="#007700">)); </font><font color="#FF8000">// float(4)<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > </P ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.types.integer.casting" >转换为整形</A ></H2 ><P > 要明示地将一个值转换为 <A HREF="language.types.integer.html" ><B CLASS="type" >integer</B ></A >,用 <TT CLASS="literal" >(int)</TT > 或 <TT CLASS="literal" >(integer)</TT > 强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个 <A HREF="language.types.integer.html" ><B CLASS="type" >integer</B ></A > 参数时,值会自动转换。还可以通过函数 <A HREF="function.intval.html" ><B CLASS="function" >intval()</B ></A > 来将一个值转换成整型。 </P ><P > 参见<A HREF="language.types.type-juggling.html" >类型戏法</A >。 </P ><DIV CLASS="sect3" ><H3 CLASS="sect3" ><A NAME="language.types.integer.casting.from-boolean" >从<A HREF="language.types.boolean.html" >布尔值</A >转换</A ></H3 ><P > <TT CLASS="constant" ><B >FALSE</B ></TT > 将产生出 <TT CLASS="literal" >0</TT >(零),<TT CLASS="constant" ><B >TRUE</B ></TT > 将产生出 <TT CLASS="literal" >1</TT >(壹)。 </P ></DIV ><DIV CLASS="sect3" ><H3 CLASS="sect3" ><A NAME="language.types.integer.casting.from-float" >从<A HREF="language.types.float.html" >浮点数</A >转换</A ></H3 ><P > 当从浮点数转换成整数时,数字将被取整(<SPAN CLASS="emphasis" ><I CLASS="emphasis" >丢弃小数位</I ></SPAN >)。 </P ><P > 如果浮点数超出了整数范围(通常为 <TT CLASS="literal" >+/- 2.15e+9 = 2^31</TT >),则结果不确定,因为没有足够的精度使浮点数给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知! </P ><P > 【译者注】在 Linux 下返回结果是最小负数(-2147483648),而在 Windows 下返回结果是零(0)。 </P ><DIV CLASS="warning" ><P ></P ><TABLE CLASS="warning" BORDER="1" WIDTH="100%" ><TR ><TD ALIGN="CENTER" ><B >警告</B ></TD ></TR ><TR ><TD ALIGN="LEFT" ><P > 决不要将未知的分数强制转换为 <A HREF="language.types.integer.html" ><B CLASS="type" >integer</B ></A >,这样有时会导致意外的结果。 <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN2910" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">echo (int) ( (</font><font color="#0000BB">0.1</font><font color="#007700">+</font><font color="#0000BB">0.7</font><font color="#007700">) * </font><font color="#0000BB">10 </font><font color="#007700">); </font><font color="#FF8000">// 显示 7!<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > 更多信息见<A HREF="language.types.float.html#warn.float-precision" >浮点数精度</A >。 </P ></TD ></TR ></TABLE ></DIV ></DIV ><DIV CLASS="sect3" ><H3 CLASS="sect3" ><A NAME="language.types.integer.casting.from-string" >从字符串转换</A ></H3 ><P > 参见<A HREF="language.types.string.html#language.types.string.conversion" >字符串转换为数字</A >。 </P ></DIV ><DIV CLASS="sect3" ><H3 CLASS="sect3" ><A NAME="language.types.integer.casting.from-other" >从其它类型转换</A ></H3 ><DIV CLASS="caution" ><P ></P ><TABLE CLASS="caution" BORDER="1" WIDTH="100%" ><TR ><TD ALIGN="CENTER" ><B >小心</B ></TD ></TR ><TR ><TD ALIGN="LEFT" ><P > 没有定义从其它类型转换为整型的行为。目前的行为和值先<A HREF="language.types.boolean.html#language.types.boolean.casting" >转换为布尔值</A >一样。不过<SPAN CLASS="emphasis" ><I CLASS="emphasis" >不要</I ></SPAN >依靠此行为,因为它会未加通知地改变。 </P ></TD ></TR ></TABLE ></DIV ></DIV ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="language.types.boolean.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >起始页</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="language.types.float.html" ACCESSKEY="N" >下一页</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >布尔型</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="language.types.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >浮点型</TD ></TR ></TABLE ></DIV ></BODY ></HTML >