Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Memento more или плавающий тип выражения
 
 автор: Trianon   (17.05.2007 в 13:05)   письмо автору
 
 


<?php 
$a 
<<30;
var_dump(+$a+$a-$a-$a);
var_dump(-$a-$a+$a+$a);
?>

   
 
 автор: mefestofel   (17.05.2007 в 13:43)   письмо автору
 
   для: Trianon   (17.05.2007 в 13:05)
 

занятно...

   
 
 автор: EXP   (17.05.2007 в 15:33)   письмо автору
 
   для: mefestofel   (17.05.2007 в 13:43)
 

var_dump($a) получается int(1073741824)
что делает <<30 ?

   
 
 автор: Trianon   (17.05.2007 в 17:00)   письмо автору
 
   для: EXP   (17.05.2007 в 15:33)
 

сдвигает первый аргумент на 30 битов влево.
Это как раз не секрет.

   
 
 автор: mefestofel   (17.05.2007 в 17:48)   письмо автору
 
   для: Trianon   (17.05.2007 в 13:05)
 

Получается что +$a+$a - это четырехбайтовое целое, равное + 2147483648
-$a-$a - это четырехбайтовое целое равное -2147483648
границы этого типа данных: -2 147 483 648...+2 147 483 647
Соответственно при превышении ...значения + 2 147 483 647, у нас это + 2147483648, происходит преобразование типа в четырехбайтовое вещественное. Хотя по логике такого не должно быть.

   
 
 автор: Trianon   (17.05.2007 в 17:53)   письмо автору
 
   для: mefestofel   (17.05.2007 в 17:48)
 

четырехбайтовое целое не может быть равно +2147483648
в остальном всё верно.

   
 
 автор: mefestofel   (17.05.2007 в 17:56)   письмо автору
 
   для: Trianon   (17.05.2007 в 17:53)
 

> четырехбайтовое целое не может быть равно +2147483648
конечно, я думаю Вы поняли что я описался, т.к. ниже указаны границы четырехбайтового целого... ;-)

   
 
 автор: mefestofel   (18.05.2007 в 05:43)   письмо автору
 
   для: Trianon   (17.05.2007 в 17:53)
 

для шестнадцатеричных тоже самое.

<?php
var_dump
(0x80000000);
?>

   
 
 автор: bronenos   (18.05.2007 в 07:32)   письмо автору
 
   для: mefestofel   (18.05.2007 в 05:43)
 

зачем сдвигать что то и что это дает

   
 
 автор: sim5   (18.05.2007 в 11:58)   письмо автору
 
   для: bronenos   (18.05.2007 в 07:32)
 

>зачем сдвигать что то и что это дает

Не знаю как разнится в РНР, но бывает, что гораздо быстрее произвести логический сдвиг числа, чем делить его.

   
 
 автор: Trianon   (18.05.2007 в 12:49)   письмо автору
 
   для: sim5   (18.05.2007 в 11:58)
 

>>зачем сдвигать что то и что это дает
>
>Не знаю как разнится в РНР, но бывает, что гораздо быстрее произвести логический сдвиг числа, чем делить его.

Именно в php разница разительная.

<?php 
$a 
=   268435466 ;
echo 
"<br>a= $a";
$b $a <<4;
$c $a *16;
echo 
"<br>b= a<<4 = $b";
echo 
"<br>c= a*16 = $c";

$d $b/64;
$f $b>>6;
echo 
"<br>d= b/64 = $d  ";
echo 
"<br>f= b>>6 = $f  ";
?>

   
 
 автор: sim5   (18.05.2007 в 13:34)   письмо автору
 
   для: Trianon   (18.05.2007 в 12:49)
 

Я хотел сказать не о точности (понятное дело что это не всегда оправдано), а о скорости выполнения операций деления и логического сдвига. Исходя из логики работы процессора, логический сдвиг, операция быстрее - данные в акумуляторе сдвигаются через флаговый регистр нужное число раз и все, операция деления это несколько сложнее процесс...
Отражается ли это на скорости выполнения этих операций в РНР, вот этого я не знаю :)

   
 
 автор: Trianon   (18.05.2007 в 13:45)   письмо автору
 
   для: sim5   (18.05.2007 в 13:34)
 

Так и я говорю не о точности. Оперируя целыми, о точности уже не говорят. Просто на обычных четырех действиях арифметики движок php отказывается оперировать целыми. Я говорю именно об этом отказе.

А скорость несложно померять.... Но думаю, результат будет в пользу сдвигов отнюдь не из-за простоты схемной реализации, а просто потому, что не придется преобразовывать аргументы к вещественному типу.

   
 
 автор: sim5   (18.05.2007 в 14:21)   письмо автору
 
   для: Trianon   (18.05.2007 в 13:45)
 

$b = $a <<4 // =160
Значит сдвиг в РНР происходит без учета переноса, в противном случае должно получится 168.

   
 
 автор: Trianon   (18.05.2007 в 14:42)   письмо автору
 
   для: sim5   (18.05.2007 в 14:21)
 

Он в любом языке (где лексема << обозначает сдвиг) таким происходит .
В С, С++, Java, JS, C#(в конечном итоге)
Во всех этих языках он превращается в инструкцию shl (в терминах Intel)
В том числе (в конечном итоге) и в PHP

   
 
 автор: sim5   (18.05.2007 в 15:05)   письмо автору
 
   для: Trianon   (18.05.2007 в 14:42)
 

Ну значит будем считать, что авторы вышеперечисленного, посчитали ненужным этот бит :)
Я по крайней мере не знаю куда он исчезает.

Даже в микроконтроллерах - при простом циклическом сдвиге крайний бит будет перходить на место бита 0 или 7, в зависимости от направления сдвига. Если сдвиг производить командой учитывающей перенос (через флаг переноса), то это позволяет в 8-разрадных процессорах производить лог. сдвиги многобайтовых чисел.

Куда исчезает бит в РНР?

   
 
 автор: Trianon   (18.05.2007 в 15:15)   письмо автору
 
   для: sim5   (18.05.2007 в 15:05)
 

и в микроконтроллерах и в микропроцессорах, как правило, есть не только команды циклического сдвига (ROL/ROR), но и обычного логического (SHL/SHR), а иногда и арифметического (SAR)
Флаг переноса в них входным операндом не является.
А в реализациях компиляторов для тех архитектур, где таких команд нет, перед ROL добавляют CLC (CLear Carry/borrow flag bit)

   
 
 автор: sim5   (18.05.2007 в 15:32)   письмо автору
 
   для: Trianon   (18.05.2007 в 15:15)
 

Логический сдвиг для микроконтроллеров - это всетаки не правило, он может отсутствовать :(
Ну главное ясна причина потери бита! :)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования