|
|
Целое это число из множества Z = {..., -2, -1, 0, 1, 2, ...}.
Смотрите также:
Целые произвольной длины / GMP,
Числа с плавающей точкой и
Произвольная точность / BCMath
Целые могут быть указаны в десятичной, шестнадцатеричной или
восьмеричной системе счисления, по желанию с предшествующим знаком (- или +).
Если вы используете восьмеричную систему счисления, вы должны
предварить число 0 (нулем), для использования
шестнадцатеричной системы нужно поставить перед числом 0x.
Пример 11-1. Целые |
<?php
$a = 1234; $a = -123; $a = 0123; $a = 0x1A; ?>
|
|
Формально возможная структура целых такова:
Размер целого зависит от платформы, хотя, как правило,
максимальное значение около двух миллиардов
(это 32-битное знаковое). PHP не поддерживает беззнаковые целые.
Если вы определите число, превышающее пределы целого типа, оно будет
интерпретировано как число с плавающей точкой. Также, если вы
используете оператор, результатом работы которого будет число,
превышающее пределы целого, вместо него будет возвращено число с
плавающей точкой.
| Внимание |
К сожалению, в PHP была ошибка, так что это не всегда верно
работает, когда используются отрицательные числа.
Например: когда вы умножаете -50000 *
$million, результатом будет
-429496728. Однако, если оба операнда
положительны, проблем не возникает.
Эта ошибка устранена в PHP 4.1.0.
|
в PHP не существует оператора деления целых.
Результатом 1/2 будет число с плавающей точкой
0.5. Вы можете привести значение к целому, что
всегда округляет его в меньшую сторону, либо использовать функцию
round().
Для несомненного преобразования значения в целое используйте приведение
типа (int) или (integer).
Однако в большинстве случаев вам нет необходимости использовать приведение типа,
поскольку значение будет автоматически преобразовано, если оператор, функция или
управляющая конструкция требует целый аргумент. Вы также можете преобразовать
значение в целое при помощи функции intval().
Смотрите также Манипуляции с типами.
FALSE преобразуется в
0 (ноль), а TRUE
- в 1 (единицу).
При преобразовании из числа с плавающей точкой в целое, число будет
округлено в сторону нуля.
Если число с плавающей точкой превышает пределы целого
(как правило, это +/- 2.15e+9 = 2^31),
результат будет неопределенным, так как целое не имеет достаточной
точности, чтобы вернуть верный результат. В этом случае не будет
выведено ни предупреждения, ни даже замечания!
| Предостережение |
Для других типов поведение преобразования в целое не определено.
В настоящее время поведение такое же, как если бы значение
сперва было преобразовано в булев тип. Однако
не полагайтесь на это поведение, так
как он может измениться без предупреждения.
|
Paul
04-Sep-2007 11:46
"always round it downwards"
It seems to truncate, or round toward zero, rather than downward. If the float is negative, it is rounded up.
Paul
04-Sep-2007 11:45
"always round it downwards"
It seems to truncate, or round toward zero, rather than downward. If the float is negative, it is rounded up.
d_n at NOSPAM dot Loryx dot com
13-Aug-2007 05:33
Here are some tricks to convert from a "dotted" IP address to a LONG int, and backwards. This is very useful because accessing an IP addy in a database table is very much faster if it's stored as a BIGINT rather than in characters.
IP to BIGINT:
<?php
$ipArr = explode('.',$_SERVER['REMOTE_ADDR']);
$ip = $ipArr[0] * 0x1000000
+ $ipArr[1] * 0x10000
+ $ipArr[2] * 0x100
+ $ipArr[3]
;
?>
IP as BIGINT read from db back to dotted form:
Keep in mind, PHP integer operators are INTEGER -- not long. Also, since there is no integer divide in PHP, we save a couple of S-L-O-W floor (<division>)'s by doing bitshifts. We must use floor(/) for $ipArr[0] because though $ipVal is stored as a long value, $ipVal >> 24 will operate on a truncated, integer value of $ipVal! $ipVint is, however, a nice integer, so
we can enjoy the bitshifts.
<?php
$ipVal = $row['client_IP'];
$ipArr = array(0 =>
floor( $ipVal / 0x1000000) );
$ipVint = $ipVal-($ipArr[0]*0x1000000); $ipArr[1] = ($ipVint & 0xFF0000) >> 16;
$ipArr[2] = ($ipVint & 0xFF00 ) >> 8;
$ipArr[3] = $ipVint & 0xFF;
$ipDotted = implode('.', $ipArr);
?>
me at troyswanson dot net
12-Jun-2007 03:11
This note applies to machines that are using a 32 bit integer size. I imagine the same results occur in 64 bit machines as well (with the number 2^63-1).
-2147483648 falls into the range of 32 bit signed integers (0b10000000000000000000000000000000), yet php treats it as a float. However, -2147483647-1 is treated as an integer.
The following code demonstrates:
<?php
var_dump(-2147483648); var_dump(-2147483647 - 1); ?>
Regards
Jacek
10-Mar-2007 04:51
On 64 bits machines max integer value is 0x7fffffffffffffff (9 223 372 036 854 775 807).
09-Mar-2007 07:26
To force the correct usage of 32-bit unsigned integer in some functions, just add '+0' just before processing them.
for example
echo(dechex("2724838310"));
will print '7FFFFFFF'
but it should print 'A269BBA6'
When adding '+0' php will handle the 32bit unsigned integer
correctly
echo(dechex("2724838310"+0));
will print 'A269BBA6'
popefelix at gmail dot com
21-Dec-2006 06:50
Be careful when using integer conversion to test something to see if it evaluates to a positive integer or not. You might get unexpected behaviour.
To wit:
<?php
error_reporting(E_ALL);
require_once 'Date.php';
$date = new Date();
print "\$date is an instance of " . get_class($date) . "\n";
$date += 0;
print "\$date is now $date\n";
var_dump($date);
$foo = new foo();
print "\$foo is an instance of " . get_class($foo) . "\n";
$foo += 0;
print "\$foo is now $foo\n";
var_dump($foo);
class foo {
var $bar = 0;
var $baz = "la lal la";
var $bak;
function foo() {
$bak = 3.14159;
}
}
?>
After the integer conversion, you might expect both $foo and $date to evaluate to 0. However, this is not the case:
$date is an instance of Date
Notice: Object of class Date could not be converted to int in /home/kpeters/work/sketches/ObjectSketch.php on line 7
$date is now 1
int(1)
$foo is an instance of foo
Notice: Object of class foo could not be converted to int in /home/kpeters/work/sketches/ObjectSketch.php on line 13
$foo is now 1
int(1)
This is because the objects are first converted to boolean before being converted to int.
rustamabd@gmail-you-know-what
12-Dec-2006 01:42
Be careful with using the modulo operation on big numbers, it will cast a float argument to an int and may return wrong results. For example:
<?php
$i = 6887129852;
echo "i=$i\n";
echo "i%36=".($i%36)."\n";
echo "alternative i%36=".($i-floor($i/36)*36)."\n";
?>
Will output:
i=6.88713E+009
i%36=-24
alternative i%36=20
jmw254 at cornell dot edu
25-Aug-2006 10:14
Try this one instead:
function iplongtostring($ip)
{
$ip=floatval($ip); // otherwise it is capped at 127.255.255.255
$a=($ip>>24)&255;
$b=($ip>>16)&255;
$c=($ip>>8)&255;
$d=$ip&255;
return "$a.$b.$c.$d";
}
rickard_cedergren at yahoo dot com
27-Jan-2005 01:15
When doing large subtractions on 32 bit unsigned integers the result sometimes end up negative. My example script converts a IPv4 address represented as a 32 bit unsigned integer to a dotted quad (similar to ip2long()), and adds a "fix" to the operation.
/**************************
* int_oct($ip)
* Convert INTeger rep of IP to octal (dotted quad)
*/
function int_oct($ip) {
/* Set variable to float */
settype($ip, float);
/* FIX for silly PHP integer syndrome */
$fix = 0;
if($ip > 2147483647) $fix = 16777216;
if(is_numeric($ip)) {
return(sprintf("%u.%u.%u.%u",
$ip / 16777216,
(($ip % 16777216) + $fix) / 65536,
(($ip % 65536) + $fix / 256) / 256,
($ip % 256) + $fix / 256 / 256
)
);
}
else {
return('');
}
}
23-Dec-2003 10:18
Sometimes you need to parse an unsigned
32 bit integer. Here's a function I 've used:
function parse_unsigned_int($string) {
$x = (float)$string;
if ($x > (float)2147483647)
$x -= (float)"4294967296";
return (int)$x;
}
|