Почему QString(FFFFFFFF).toInt(0, 16); возвращает 0?

Как вы, возможно, знаете, 0xFFFFFFFF в представлении с дополнением до двух равно -1 (для 32 бит). Но следующий код:

qint32 aa = QString("FFFFFFFF").toInt(0, 16);
qDebug()<<aa;

печатает 0. Код ниже:

qint32 aa = 0xffffffff;
qDebug()<<aa;

печатает -1!

Почему это?


person s4eed    schedule 14.07.2013    source источник


Ответы (2)


Если вы прочитаете документацию, вы увидите, что toInt " Возвращает 0, если преобразование не удалось."

Ваш ввод не помещается в 32-битное целое число со знаком, поэтому, по-видимому, преобразование не выполняется.

Вы можете убедиться в этом, используя параметр ok:

bool ok;
qint32 aa = QString("FFFFFFFF").toInt(&ok, 16);
if (ok) qDebug() << aa;
else qDebug() << "Conversion failed!";
person Magnus Hoff    schedule 14.07.2013
comment
Я не понимаю, почему Ваш ввод не помещается в 32-битное целое число со знаком. Разве это не -1?! - person s4eed; 14.07.2013
comment
-1 это -1. 0xFFFFFFFF это 4294967295. Обработка этого как -1 потребует правила для обработки переполнения, такого как дополнение до двух, но QString::toInt не имеет такой семантики. QString::toInt рассматривает переполнение как ошибку. Это делает его поведение более предсказуемым для разных архитектур, что важно для кроссплатформенного инструментария :) - person Magnus Hoff; 14.07.2013
comment
преобразование завершается неудачно. отсутствует шестнадцатеричное ключевое слово 0x. - person Sebastian Lange; 15.07.2013
comment
@SebastianLange Что заставляет тебя так говорить? Согласно документации, которую я связал, вы должны указать базу (основание) 0 для toInt, чтобы автоматически вывести базу из префикса. Указание базы как 16 заставляет toInt понимать шестнадцатеричное значение независимо от того, присутствует ли префикс 0x, поэтому, например, QString("FF").toInt(0, 16) успешно оценивается как 255. Это согласуется с тем, что я обнаружил при тестировании. - person Magnus Hoff; 15.07.2013
comment
Я тоже пробовал, и это не помогло, но я перепроверил и увидел, что забыл установить базу, как вы. Преобразование работает без префикса 0x, так что вы правы. Но все же преобразование не дает мне FFFFFFFF - person Sebastian Lange; 15.07.2013

FFFFFFFF не является целочисленным форматом. 0xFFFFFFFF есть. А также 0xFFFFFFFF выходит за пределы диапазона int. Попробуйте использовать целое число со знаком. Измените функцию преобразования toInt на toUInit. Вот код:

quint32 aa = QString("0xffffffff").toUInt(0, 16);
quint32 bb = 0xffffffff;
qDebug()<<aa;
qDebug()<<bb;

Проверено на моей машине. Вывод 4294967295.

person lulyon    schedule 14.07.2013