Я читаю регистры устройства i2c, и диапазон возвращаемого значения составляет от -32768 до 32768, целые числа со знаком. Ниже приведен пример:
# i2cget -y 3 0x0b 0x0a w
0xfec7
В Qt я получаю это значение (0xfec7) и хочу отобразить его в QLabel в виде целого числа со знаком. Переменная stringListSplit [0] является QString со значением ‘0xfec7’.
// Now update the label
int milAmps = stringListSplit[0].toInt(0,16); // tried qint32
qDebug() << milAmps;
Проблема не в том, что я пытаюсь, я всегда получаю целые числа без знака, поэтому в этом примере я получаю 65223, что превышает указанное максимальное возвращаемое значение. Мне нужно преобразовать шестнадцатеричное значение в целое число со знаком, поэтому мне нужно обрабатывать шестнадцатеричное значение как выражение с дополнением 2s. Я не вижу простой метод в документации QString. Как я могу добиться этого в Qt?
НОТА:
QString :: toShort возвращает 0:
// Now update the label
short milAmps = stringListSplit[0].toShort(0,16);
qDebug() << "My new result: " << milAmps;
Для ввода stringListSplit [0], равного ‘0xfebe’, я получаю вывод -322, используя приведение в стиле C, на которое ответил Кит, так:
// Now update the label
int milAmps = stringListSplit[0].toInt(0,16);
qDebug() << "My new result: " << (int16_t)milAmps;
Приведите ваш результат к 16-разрядному целому числу со знаком.
qDebug() << (int16_t)milAmps;
Вам необходимо преобразовать эту строку в 16-разрядное целое число. Скорее всего, вы можете использовать QString::toShort
метод.
short milAmps = stringListSplit[0].toShort(0,16);
qDebug() << milAmps;