EnglishУкраїнськаmRussian
Login/New
Topic with no new replies

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


Author Message
Written on: 23. 03. 2018 [11:23]
LeDima
Дима Лещев
Topic creator
registered since: 26.05.2015
Posts: 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

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

Written on: 23. 03. 2018 [12:02]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"LeDima" wrote:

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

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

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

[This article was edited 1 times, at last 23.03.2018 at 12:33.]
Written on: 23. 03. 2018 [12:48]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"LeDima" wrote:

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

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

Learn, learn and learn better than work, work and work.
Written on: 23. 03. 2018 [14:59]
LeDima
Дима Лещев
Topic creator
registered since: 26.05.2015
Posts: 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 версии старший разряд учитывается и преобразовывается к отрицательным значениям а в рабочей почему то нет.
Written on: 23. 03. 2018 [15:21]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"LeDima" wrote:

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

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

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



5658