Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Работа с числами более 0x7FFFFFFF

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
Hapson
Отправлено: 23 Ноября, 2013 - 16:07:39
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Всем привет.
Вот на какой косяк я наткнулся сейчас.
Есть к примеру в базе таблица "integer" с одним единственным полем: "id" - INT(10) UNSIGNED
записал я в это поле значение более 0x7FFFFFFF, дальше попытался выбрать это значение в скрипте.
PHP:
скопировать код в буфер обмена
  1.  
  2. $int = "select `id` from `integer`";
  3.  
  4. var_dump($int); // string(10) "4294469992"
  5. var_dump((int)$int); // int(2147483647)
  6.  


Теперь два вопроса:

1) на кой черт в MySQL поле unsigned?
2) как работать с такими числами в php?

И еще


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
teddy
Отправлено: 23 Ноября, 2013 - 16:39:37
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Hapson пишет:
на кой черт в MySQL поле unsigned?

unsigned это значит что числа в колонке будут больше либо рано нулю
Hapson пишет:
как работать с такими числами в php?

так же как и с обычными... php понимает что это число даже если у него строковый тип
PHP:
скопировать код в буфер обмена
  1. $n1 = "2";
  2. $n2 = "5";
  3. echo $n1 * $n2;//10
 
 Top
Мелкий Супермодератор
Отправлено: 23 Ноября, 2013 - 16:46:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




В PHP int - всегда signed.
Если у вас 32-битный PHP или винда - то никак и только через bcmath.


-----
PostgreSQL DBA
 
 Top
caballero
Отправлено: 23 Ноября, 2013 - 16:50:05
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
на кой черт в MySQL поле unsigned?

например для автоинкремента

Цитата:
как работать с такими числами в php?

использовать float или библиотеку BC Math

либо пересобрать PHP из сорцов с соответствующим подпиливанием для 64 разрядных интов.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 23 Ноября, 2013 - 17:02:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


teddy пишет:
unsigned это значит что числа в колонке будут больше либо рано нулю

это я знаю
teddy пишет:
так же как и с обычными... php понимает что это число даже если у него строковый тип

Нет
PHP:
скопировать код в буфер обмена
  1.  
  2. $num = 0x7FFFFFFF;
  3. echo $num .'<br />'; // 2147483647
  4. $shift = $num >> 8;
  5. echo $shift .'<br />'; // 8388607
  6.  
  7. $num = 0xFFFFFFFF;
  8. echo $num .'<br />'; // 4294967295
  9. $shift = $num >> 8;
  10. echo $shift .'<br />'; // -1
  11.  

Мелкий пишет:
В PHP int - всегда signed.

В том и проблема
caballero пишет:
например для автоинкремента

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. CREATE TABLE `integer` (
  3.         `id` INT(10) NOT NULL AUTO_INCREMENT,
  4.         `name` CHAR(50) NOT NULL,
  5.         PRIMARY KEY (`id`)
  6. )
  7.  

работает
(Добавление)
caballero пишет:
использовать float

PHP:
скопировать код в буфер обмена
  1.  
  2. $num = 0x7FFFFFFF;
  3. echo $num .'<br />'; // 2147483647
  4. $shift = $num >> 8;
  5. echo $shift .'<br />'; // 8388607
  6.  
  7. $num = (float)0xFFFFFFFF;
  8. echo $num .'<br />'; // 4294967295
  9. $shift = $num >> 8;
  10. echo $shift .'<br />'; // -1
  11.  

Неа.
Нужно выполнять побитовые операции с такими числами. Переставлять биты и т.п...
(Добавление)
teddy пишет:
так же как и с обычными... php понимает что это число даже если у него строковый тип

Блин... teddy ты прав
PHP:
скопировать код в буфер обмена
  1.  
  2. $num = 0x7FFFFFFF;
  3. echo $num .'<br />'; // 2147483647
  4. $shift = $num >> 8;
  5. echo $shift .'<br />'; // 8388607
  6.  
  7. $num = (string)0xFFFFFFFF;
  8. echo $num .'<br />'; // 4294967295
  9. $shift = $num >> 8;
  10. echo $shift .'<br />'; // 8388607
  11.  


уж такого я никак не ожидал
(Добавление)
Ну что, всем спасибо, особенно teddy
Просто я писал функцию шифрования чисел в буквенную строку. В теле функции много побитовых операций, и вот столкнулся с траблом больших чисел.
Всегда старался переменные явно приводить к числам, перед тем как совершать с ними мат.операции, но тут вот оно как...
PHP странный язык...


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
OrmaJever Модератор
Отправлено: 23 Ноября, 2013 - 17:37:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Hapson double имеет большие граничные значения, но это если не 32 битная версия.
PHP:
скопировать код в буфер обмена
  1. echo (int)0x7FFFFFFF, '<br>';
  2. echo (double)0x7FFFFFFF;


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Hapson
Отправлено: 23 Ноября, 2013 - 17:45:01
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


OrmaJever пишет:
если не 32 битная версия

вот если бы не если...


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
caballero
Отправлено: 23 Ноября, 2013 - 18:10:52
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
уж такого я никак не ожидал

он работает как с битовой строкой

Цитата:
double имеет большие граничные значения, но это если не 32 битная версия

не вижу какая разница.

в других языках есть и long int и double c восемью байтами
и от разрядности системмы это не зависит
а исключительно он компилятрора


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 23 Ноября, 2013 - 20:10:13
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


блин все равно лажа...
Сдвиг на строке работает, а XOR нет.


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
OrmaJever Модератор
Отправлено: 23 Ноября, 2013 - 20:13:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Hapson пишет:
вот если бы не если...

чисто теоретически на многих хостингах стоит 64 битный линукс, ну и для тестов я не думаю что большая проблема поставить вин64.
(Добавление)
caballero пишет:
и от разрядности системмы это не зависит
а исключительно он компилятрора

Я очень рад, но увы компилятор php в 32 битной версии не имеет 8 байтового типа. (хотя это в винде, возможно в 32 битном линуксе double 8 байт)


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Hapson
Отправлено: 24 Ноября, 2013 - 16:16:58
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


OrmaJever пишет:
чисто теоретически на многих хостингах стоит 64 битный линукс, ну и для тестов я не думаю что большая проблема поставить вин64.

Код должен быть кроссплатформенным, 32 битные системы еще не скоро вымрут
(Добавление)
собственно работать с числами до 0xFFFFFFFF включительно можно, но не нужно, так как это костыли.
Для примера можете попробовать, кому интересно
PHP:
скопировать код в буфер обмена
  1.  
  2. $n = (int)0xFFFFFFFF;
  3. echo $n;
  4. $n = sprintf("%u", $n);
  5. echo $n;
  6.  


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
OrmaJever Модератор
Отправлено: 24 Ноября, 2013 - 16:22:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Почему же? Уже наверное все процессоры поддерживают 64 битную архитекуру, с операционными системами тоже проблем нет, софта тоже куча.
Лично в моих глазах 32 бита уже вымерли, не вижу в них преймуществ.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DelphinPRO
Отправлено: 24 Ноября, 2013 - 16:35:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




OrmaJever пишет:
Почему же? Уже наверное все процессоры поддерживают 64 битную архитекуру

у меня 64 битная Win8
Но ввиду того что сам пых - з2 битный - работа с большими числами осложнена.
Н хостинге, конечно проблем нет, но начальная разработка все же ведется локально под виндой


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
OrmaJever Модератор
Отправлено: 24 Ноября, 2013 - 16:40:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




DelphinPRO пишет:
Но ввиду того что сам пых - з2 битный

ну да, ведь скачать 64 битный это проблема Растерялся


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DelphinPRO
Отправлено: 24 Ноября, 2013 - 18:00:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




OrmaJever пишет:
ну да, ведь скачать 64 битный это проблема

в общем да. http://windows.php.net/download/
64 битного php5,3 просто нет


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB