【问题标题】:Why QString("FFFFFFFF").toInt(0, 16); returns 0?为什么 QString("FFFFFFFF").toInt(0, 16);返回 0?
【发布时间】:2013-07-14 10:36:33
【问题描述】:

您可能知道,二进制补码表示中的 0xFFFFFFFF 等于 -1(对于 32 位)。但是下面的代码:

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

打印0。下面的代码:

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

打印-1!

这是为什么?

【问题讨论】:

    标签: qt qstring twos-complement


    【解决方案1】:

    如果您阅读the documentation,您会看到toInt“如果转换失败,则返回 0。”

    您的输入不适合带符号的 32 位整数,因此可能转换失败。

    您可以使用ok-参数来验证这一点:

    bool ok;
    qint32 aa = QString("FFFFFFFF").toInt(&ok, 16);
    if (ok) qDebug() << aa;
    else qDebug() << "Conversion failed!";
    

    【讨论】:

    • 我不明白为什么您的输入不适合带符号的 32 位整数。不是 -1 吗?!
    • 没有。 -1-10xFFFFFFFF4294967295。将其视为-1 将需要处理溢出的规则,例如二进制补码,但QString::toInt 没有这样的语义。 QString::toInt 将溢出视为错误。这使得它的行为跨架构更可预测,这在跨平台工具包中很重要:)
    • 转换失败,缺少 0x 十六进制关键字。
    • @SebastianLange 是什么让你这么说?根据我链接的文档,您必须为toInt 指定基数(基数)0 才能自动从前缀中推断出基数。将基数指定为16 会使toInt 理解十六进制,无论0x 前缀是否存在,例如QString("FF").toInt(0, 16) 成功计算为255。这与我发现的测试结果一致。
    • 我也试过了,但失败了,但我重新检查过,我发现我忘了像你一样设置底座。转换工作没有 0x 前缀,所以你是对的。但是对于 FFFFFFFF,我的转换仍然失败
    【解决方案2】:

    FFFFFFFF 不是整数格式。 0xFFFFFFFF 是。而且 0xFFFFFFFF 超出了 int 范围。尝试使用无符号整数。将转换函数 toInt 更改为 toUInit。代码如下:

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

    已经在我的机器上测试过了。输出为 4294967295。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 2011-07-01
      • 2011-01-17
      相关资源
      最近更新 更多