5

我正在读取 i2c 设备的寄存器,返回值的范围是 -32768 到 32768,有符号整数。下面是一个例子:

# i2cget -y 3 0x0b 0x0a w
0xfec7

在 Qt 中,我得到这个值( 0xfec7 )并希望在 QLabel 中将其显示为有符号整数。变量 stringListSplit[0] 是一个值为 '0xfec7' 的 QString。

// 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;

对于等于 '0xfebe' 的 stringListSplit[0] 的输入,我使用 Keith 回答的 C 风格转换得到 -322 的输出,如下所示:

// Now update the label
int milAmps = stringListSplit[0].toInt(0,16);
qDebug() << "My new result: " << (int16_t)milAmps;
4

2 回答 2

4

您需要将此字符串转换为 16 位整数。您很可能可以使用QString::toShort方法。

short milAmps = stringListSplit[0].toShort(0,16); 
qDebug() << milAmps;
于 2012-09-04T19:59:23.147 回答
3

将结果转换为有符号的 16 位整数。

qDebug() << (int16_t)milAmps;
于 2012-09-04T19:59:55.207 回答