forked from php/doc-zh
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathinteger.xml
More file actions
290 lines (244 loc) · 8.73 KB
/
integer.xml
File metadata and controls
290 lines (244 loc) · 8.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 78a11d3ca004ee937549d932e77a79c51b9777cd Maintainer: Avenger Status: ready -->
<!-- CREDITS: Gregory, dallas, Altair, mowangjuanzi, Luffy -->
<sect1 xml:id="language.types.integer">
<title>Integer 整型</title>
<simpara>
<type>int</type> 是集合 ℤ = {..., -2, -1, 0, 1, 2, ...} 中的某个数。
</simpara>
<sect2 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><link linkend="language.types.float">浮点数</link></member>
<member><link linkend="book.bc">任意精度/BCMath</link></member>
<member><link linkend="book.gmp">任意长度整数/GMP</link></member>
</simplelist>
</para>
</sect2>
<sect2 xml:id="language.types.integer.syntax">
<title>语法</title>
<simpara>
<type>Int</type> 可以使用十进制,十六进制,八进制或二进制表示,前面可以加上可选的符号(- 或者 +)。
可以用<link linkend="language.operators.arithmetic">负运算符</link>
来表示一个负的 <type>int</type>。
</simpara>
<para>
要使用八进制表达,数字前必须加上 <literal>0</literal>(零)。
PHP 8.1.0 起,八进制表达也可以在前面加上 <literal>0o</literal> 或者 <literal>0O</literal> 。
要使用十六进制表达,数字前必须加上
<literal>0x</literal>。要使用二进制表达,数字前必须加上
<literal>0b</literal>。
</para>
<para>
从 PHP 7.4.0
开始,整型数值可能会包含下划线 (<literal>_</literal>),为了更好的阅读体验,这些下划线在展示的时候,会被 PHP 过滤掉。
</para>
<example>
<title>整数文字表达</title>
<programlisting role="php" annotations="non-interactive">
<![CDATA[
<?php
$a = 1234; // 十进制数
$a = 0123; // 八进制数 (等于十进制 83)
$a = 0o123; // 八进制数 (PHP 8.1.0 起)
$a = 0x1A; // 十六进制数 (等于十进制 26)
$a = 0b11111111; // 二进制数字 (等于十进制 255)
$a = 1_234_567; // 整型数值 (PHP 7.4.0 以后)
?>
]]>
</programlisting>
</example>
<para>
<type>int</type> literal 的结构形式从 PHP 8.1.0 开始是(之前不允许使用 <literal>0o</literal> 或
<literal>0O</literal> 八进制前缀,并且 PHP 7.4.0 之前不允许使用下划线):
</para>
<informalexample>
<programlisting>
<![CDATA[
decimal : [1-9][0-9]*(_[0-9]+)*
| 0
hexadecimal : 0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)*
octal : 0[oO]?[0-7]+(_[0-7]+)*
binary : 0[bB][01]+(_[01]+)*
integer : decimal
| hexadecimal
| octal
| binary
]]>
</programlisting>
</informalexample>
<para>
整型数 <type>int</type> 的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。64
位平台下的最大值通常是大约 9E18。
PHP 不支持无符号的 <type>int</type>。<type>int</type> 值的字长可以用常量
<constant>PHP_INT_SIZE</constant>来表示,
最大值可以用常量 <constant>PHP_INT_MAX</constant> 来表示,
最小值可以用常量 <constant>PHP_INT_MIN</constant> 表示。
</para>
</sect2>
<sect2 xml:id="language.types.integer.overflow">
<title>整数溢出</title>
<para>
如果给定的一个数超出了 <type>int</type> 的范围,将会被解释为
<type>float</type>。同样如果执行的运算结果超出了
<type>int</type> 范围,也会返回 <type>float</type>。
</para>
<example>
<title>整数溢出</title>
<programlisting role="php">
<![CDATA[
<?php
$large_number = 50000000000000000000;
var_dump($large_number); // float(5.0E+19)
var_dump(PHP_INT_MAX + 1); // 32 位系统:float(2147483648)
// 64 位系统:float(9.2233720368548E+18)
?>
]]>
</programlisting>
</example>
</sect2>
<sect2 xml:id="language.types.integer.division">
<title>整数除法</title>
<para>
PHP 没有 <type>int</type> 除法取整运算符,要使用 <function>intdiv</function> 实现。
<literal>1/2</literal> 产生出 <type>float</type>
<literal>0.5</literal>。
值可以舍弃小数部分,强制转换为 <type>int</type>,或者使用
<function>round</function> 函数可以更好地进行四舍五入。
</para>
<example>
<title>Divisions</title>
<programlisting role="php">
<![CDATA[
<?php
var_dump(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
?>
]]>
</programlisting>
</example>
</sect2>
<sect2 xml:id="language.types.integer.casting">
<title>转换为整型</title>
<simpara>
要明确地将一个值转换为 <type>int</type>,用 <literal>(int)</literal> 强制转换。
不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个
<type>int</type> 参数时,值会自动转换。还可以通过函数
<function>intval</function> 来将一个值转换成 <type>int</type> 整型。
</simpara>
<simpara>
将 <type>resource</type> 转换成 <type>int</type> 时,
结果会是 PHP 运行时为 <type>resource</type> 分配的唯一资源号。
</simpara>
<simpara>
参见:<link linkend="language.types.type-juggling">类型转换的判别</link>。
</simpara>
<sect3 xml:id="language.types.integer.casting.from-boolean">
<title>从<link linkend="language.types.boolean">布尔值</link>转换</title>
<simpara>
&false; 将产生出 <literal>0</literal>(零),&true; 将产生出
<literal>1</literal>(壹)。
</simpara>
</sect3>
<sect3 xml:id="language.types.integer.casting.from-float">
<title>
从<link linkend="language.types.float">浮点型</link>转换
</title>
<simpara>
当从浮点数 <type>float</type> 转换成整数 <type>int</type>时,将<emphasis>向零</emphasis>取整。自
PHP 8.1.0 起,当将非整数类型的 &float; 转换为失去精度的 &integer; 时,会发出弃用通知。
</simpara>
<example>
<title>从浮点数转换</title>
<programlisting role="php">
<![CDATA[
<?php
function foo($value): int {
return $value;
}
var_dump(foo(8.1)); // 自 PHP 8.1.0 起:“Deprecated: Implicit conversion from float 8.1 to int loses precision”
var_dump(foo(8.1)); // PHP 8.1.0 之前为 8
var_dump(foo(8.0)); // 均为 8
var_dump((int) 8.1); // 均为 8
var_dump(intval(8.1)); // 均为 8
?>
]]>
</programlisting>
</example>
<para>
如果浮点数超出了 <type>int</type> 范围(32 位平台下通常为
<literal>+/- 2.15e+9 = 2^31</literal>,64 位平台下,通常为
<literal>+/- 9.22e+18 = 2^63</literal>),则结果为未定义,
因为没有足够的精度给出一个确切的 <type>int</type> 结果。
在此情况下没有警告,甚至没有任何通知!
</para>
<note>
<para>
<literal>NaN</literal>、<literal>Inf</literal> 和 <literal>-Inf</literal> 在转换成 <type>int</type> 时是零。
</para>
</note>
<warning>
<para>
绝不要将未知的分数强制转换为 <type>int</type>,这样有时会导致不可预料的结果。
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
echo (int) ( (0.1+0.7) * 10 ); // 显示 7!
?>
]]>
</programlisting>
</informalexample>
<para>
参见<link linkend="warn.float-precision">关于浮点数精度的警告</link>。
</para>
</warning>
</sect3>
<sect3 xml:id="language.types.integer.casting.from-string">
<title>从字符串转换</title>
<simpara>
如果 string 是 <link linkend="language.types.numeric-strings">numeric</link> 或者前导数字,
则将它解析为相应的 int 值,否则将转换为零(<literal>0</literal>)。
</simpara>
</sect3>
<sect3 xml:id="language.types.integer.casting-from-null">
<title>从 <type>NULL</type> 转换</title>
<simpara>
&null; 会转换为零(<literal>0</literal>)。
</simpara>
</sect3>
<sect3 xml:id="language.types.integer.casting.from-other">
<title>从其它类型转换</title>
<caution>
<simpara>
没有定义从其它类型转换为 <type>int</type> 的行为。
<emphasis>不要</emphasis>依赖任何现有的行为,因为它会未加通知地改变。
</simpara>
</caution>
</sect3>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->