将未签名的字符转换为红黑色树的签名字符

Casting unsigned char to signed char for a red-black tree

本文关键字:字符 黑色 转换      更新时间:2023-10-16

概述

我正在努力用Qt包装Windows Shell功能。我遇到的关于ABSOLUTE_IDLIST和存储数据的问题。作为参考,a Windows id 列表在内存中如下所示:

//Note that there may be an arbitrary number of cb/abId pairs.
=================================================================
=           =   (cb bytes)  =           =  (cb bytes)   =       =
= USHORT cb =  UCHAR []abID = USHORT cb =  UCHAR []abId = ''  =
=================================================================

我使用绝对ID作为每个节点的唯一标识符,以便快速 检索。值类型是ShellNodePointer,一个指向ShellNode的共享指针,用于缓存数据。我最初使用QHash(基本上是std::unordored_map(,但这需要对每次检索的位进行哈希处理(尽管我将哈希键存储在 ShellNode 中(。

//unsigned int is the hash result, ShellNodePointer is a QSharedPointer to a ShellNode
QHash<unsigned int, ShellNodePointer>

相反,我正在考虑使用QMap的红黑树方法。我的问题是 这:比较两个键的最快方法是将它们存储为QByteArrays,这将允许快速小于比较并将 id 列表作为原始数据简单地传递给QByteArray构造函数。

ITEMIDLIST_ABSOLUTE *someIdListPointer = ...;
QByteArray ba(someIdListPointer);

问题所在

不幸的是,QByteArray采用以零结尾的const char *,没有 指定已签名或未签名。由于我在 Windows 上,因此默认为已签名 煳。

问题

我可以投[signed] char *并忽略溢出问题,因为每个负值键都会以相同的方式溢出吗?具体来说,红黑树是否仍能正常工作,因为结果数据保证在具有相同键的两个单独调用中是统一的?

注意:我知道USHORT cb将包含在密钥中。这是可以接受的,因为它只是与两个相同键匹配的额外数据。

编辑:澄清abId实际上是一个没有空终止符的数组。

我可以投射到 [signed] char * 并忽略溢出问题吗,因为每个负值键都会以相同的方式溢出?具体来说,红黑树是否仍能正常工作,因为结果数据保证在具有相同键的两个单独调用中是统一的?

是的,像这样的强制转换只是以不同的方式解释内存中的字节,并且对于相同的机器 + 可执行文件/编译器是一致的。有符号整数的字节表示不是标准规定的,因此"含义"(即表示的数字(可能不是您所期望的,但对于只需要总排序的 RB 树来说,这无关紧要。