QByteArray引发的bug

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QByteArray ba;
    ba.resize(5);
    ba[0] = 0Xc3;
    ba[1] = 0Xb8;
    ba[2] = 0X64;
    ba[3] = 0X18;
    ba[4] = 0Xca;

    if(ba.at(0) == 0xc3)
    {
        qDebug() << "ba.at(0) = 0xc3";
    }
    else
    {
        qDebug() << "ba.at(0) != 0xc3";
    }
    return a.exec();
}

 

在Qt中输出

ba.at(0) != 0xc3

经过思考发现,QByteArray是char类型,而char类型中0XC3的最高位表示的是符号位,也就是说ba.at(0)应该是-61。而0XC3是unsigned char类型,对应的是195。-61和195相比较,必然是不相等。

  • unsigned char和char类型的区别
    在内存当中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255。
    也就是说在比较两个大于零的数的时候,没问题,可以比较,但是当char的值为负数,如-1时,是没有办法和unsigned char类型的变量进行比较的。

  • 回顾一开始的问题
    所以if(0x10 == data.size() && 0xCA == (unsigned char)data.at(10) && 0x01 == (unsigned char)data.at(11))在比较0xCAdata.at(10)的时候,必须要加unsigned char

posted on 2020-09-28 15:02  回形针的迷宫  阅读(313)  评论(0编辑  收藏  举报

导航