УкраїнськаEnglishmRussian
Вход/Новый
В теме нет новых постов

Метод .toInt() в LTS версии и рабочей работает по разному.


Автор Сообщение
Сообщение создано: 23. 03. 2018 [11:23]
LeDima
Дима Лещев
Создатель темы
Зарегистрирован(а) с: 26.05.2015
Сообщения: 6
В версии LTS(приблизительно 2016г-2017г) и рабочей из Живого диска 0.9-r2537 работает по разному.
В LTS нормально преобразует 32-разрядное знаковое шестнадцатеричное число(строка) в знаковой десятеричное.
В Рабочей с Живого диска 0.9-r2537 разрядность стала 64? и при этом не преобразует в отрицательные числа
"7FFFFFFFFFFFFFFE".toInt(16) ----> 9223372036854775806
"7FFFFFFFFFFFFFFF".toInt(16) ----> 9223372036854775807

"8000000000000000".toInt(16) ----> 9223372036854775807
"8FFFFFFFFFFFFFFF".toInt(16) ----> 9223372036854775807
"FFFFFFFFFFFFFFFF".toInt(16) ----> 9223372036854775807

Это баг, фича или так и должно быть?

Сообщение создано: 23. 03. 2018 [12:02]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3742
"LeDima" wrote:

Это баг, фича или так и должно быть?

Это объективное различие в эволюции рабочей ветви и ветви продолжительной поддержки.
По факту целое в 0.8 LTS было 32-разрядным и остаётся таким для совместимости!

Learn, learn and learn better than work, work and work.
Сообщение создано: 23. 03. 2018 [12:20]
LeDima
Дима Лещев
Создатель темы
Зарегистрирован(а) с: 26.05.2015
Сообщения: 6
Это значит что в рабочей версии необходимо создавать свою функцию которая правильно преобразует строку?
И в отрицательные значения .toInt() в рабочей версии не преобразует?

[Сообщение редактировалось 1 раз(а), в последний раз 23.03.2018 в 12:33.]
Сообщение создано: 23. 03. 2018 [12:48]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3742
"LeDima" wrote:

Это значит что в рабочей версии необходимо создавать свою функцию которая правильно преобразует строку?
И в отрицательные значения .toInt() в рабочей версии не преобразует?

Причём тут отрицательное в шестнадцатеричном представлении, не говоря уже о том, что сама эта функция никаких преобразований не делает, а делает системная.
Исходники смотрите сначала и читайте про strtoll(), где кстати перед шестнадцатеричным можно знак поставить.

Learn, learn and learn better than work, work and work.
Сообщение создано: 23. 03. 2018 [14:59]
LeDima
Дима Лещев
Создатель темы
Зарегистрирован(а) с: 26.05.2015
Сообщения: 6
Ну как причем, старший разряд числа показывает знак.
В общем посмотрел в исходниках
return (int)strtol(vl.getS().c_str(),NULL,(prms.size()>=1?prms[0].getI():0)); в LTS
return (int64_t)strtoll(vl.getS().c_str(), NULL, (prms.size()>=1?prms[0].getI():10)); в Рабочей
Разница в применяемых функциях и какому типу преобразовать...
Но в LTS версии старший разряд учитывается и преобразовывается к отрицательным значениям а в рабочей почему то нет.
Сообщение создано: 23. 03. 2018 [15:21]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3742
"LeDima" wrote:

Но в LTS версии старший разряд учитывается и преобразовывается к отрицательным значениям а в рабочей почему то нет.

Чего Вы сюда пишете? Напишите в GLibC, если это Вас как-то не устраивает!
Меня-же всё устраивает.

Learn, learn and learn better than work, work and work.



3321