From 260168d9d7547a2e7586bff6cb42e11d54c9d06e Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Fri, 30 Jul 2021 15:55:08 +0200 Subject: QByteArray: don't coerce negative to unsigned for any base This follows up on commit 98666c8afc80cccb80ca4426b97ec52916c6e610, which did the same for QString. If someone wants to get formatting suitable to an unsigned value, they can cast the value to that unsigned type and the correct overload shall pick it up. [ChangeLog][Important Behavior Changes] QByteArray's formatting of negative whole numbers to bases other than ten now, like QString's (since Qt 6.0), formats the absolute value and prepends a minus sign. Task-number: QTBUG-53706 Pick-to: 6.2 Change-Id: I91fee23d25ac0d5d5bcfcbeccbac1386627c004a Reviewed-by: Thiago Macieira --- src/corelib/text/qbytearray.cpp | 5 +++-- src/corelib/text/qbytearray.h | 6 +++--- tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp | 11 +++++------ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index 03e3f0611a..32e10b9512 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -3866,7 +3866,7 @@ QByteArray QByteArray::toBase64(Base64Options options) const Sets the byte array to the printed value of \a n in base \a base (ten by default) and returns a reference to the byte array. Bases 2 through 36 are supported, using letters for digits beyond 9; A is ten, B is eleven and so - on. For bases other than ten, n is treated as an unsigned integer. + on. Example: \snippet code/src_corelib_text_qbytearray.cpp 40 @@ -3942,7 +3942,8 @@ QByteArray &QByteArray::setNum(qlonglong n, int base) char buff[buffsize]; char *p; - if (n < 0 && base == 10) { + if (n < 0) { + // Take care to avoid overflow on negating min value: p = qulltoa2(buff + buffsize, qulonglong(-(1 + n)) + 1, base); *--p = '-'; } else { diff --git a/src/corelib/text/qbytearray.h b/src/corelib/text/qbytearray.h index 91f50d76c3..2d614f1fe0 100644 --- a/src/corelib/text/qbytearray.h +++ b/src/corelib/text/qbytearray.h @@ -598,15 +598,15 @@ inline const QByteArray operator+(char a1, const QByteArray &a2) #endif // QT_USE_QSTRINGBUILDER inline QByteArray &QByteArray::setNum(short n, int base) -{ return base == 10 ? setNum(qlonglong(n), base) : setNum(qulonglong(ushort(n)), base); } +{ return setNum(qlonglong(n), base); } inline QByteArray &QByteArray::setNum(ushort n, int base) { return setNum(qulonglong(n), base); } inline QByteArray &QByteArray::setNum(int n, int base) -{ return base == 10 ? setNum(qlonglong(n), base) : setNum(qulonglong(uint(n)), base); } +{ return setNum(qlonglong(n), base); } inline QByteArray &QByteArray::setNum(uint n, int base) { return setNum(qulonglong(n), base); } inline QByteArray &QByteArray::setNum(long n, int base) -{ return base == 10 ? setNum(qlonglong(n), base) : setNum(qulonglong(ulong(n)), base); } +{ return setNum(qlonglong(n), base); } inline QByteArray &QByteArray::setNum(ulong n, int base) { return setNum(qulonglong(n), base); } inline QByteArray &QByteArray::setNum(float n, char f, int prec) diff --git a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp index e9d0cf8236..0db139b518 100644 --- a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp +++ b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp @@ -425,18 +425,17 @@ void tst_QByteArray::setNum() QCOMPARE(a.setNum(37, 2), QByteArray("100101")); QCOMPARE(a.setNum(37, 36), QByteArray("11")); - // Negative numbers are only properly supported for base 10. - QCOMPARE(a.setNum(short(-1), 16), QByteArray("ffff")); - QCOMPARE(a.setNum(int(-1), 16), QByteArray("ffffffff")); - QCOMPARE(a.setNum(qlonglong(-1), 16), QByteArray("ffffffffffffffff")); + QCOMPARE(a.setNum(short(-1), 16), QByteArray("-1")); + QCOMPARE(a.setNum(int(-1), 16), QByteArray("-1")); + QCOMPARE(a.setNum(qlonglong(-1), 16), QByteArray("-1")); QCOMPARE(a.setNum(short(-1), 10), QByteArray("-1")); QCOMPARE(a.setNum(int(-1), 10), QByteArray("-1")); QCOMPARE(a.setNum(qlonglong(-1), 10), QByteArray("-1")); QCOMPARE(a.setNum(-123), QByteArray("-123")); - QCOMPARE(a.setNum(0x123,16), QByteArray("123")); - QCOMPARE(a.setNum((short)123), QByteArray("123")); + QCOMPARE(a.setNum(0x123, 16), QByteArray("123")); + QCOMPARE(a.setNum(short(123)), QByteArray("123")); QCOMPARE(a.setNum(1.23), QByteArray("1.23")); QCOMPARE(a.setNum(1.234567), QByteArray("1.23457")); -- cgit v1.2.3-59-g8ed1b