我正在尝试针对大学课堂练习优化String课堂。
普通字符串存储为char *和size_t作为长度。 sizeof(String)是8,它应该像这样保持不变。但是,如果我只有7个或更少字符的字符串(如果考虑空终止符,则为6个字符),而不是使用指针,我想将它们直接存储在指针/ size_t字节中。

为此,我有两个结构,一个用于char *和size_t,一个具有8个字符(字节)的数组。我俩都放入了一个工会,并给String类指定了该工会的成员。

为了确定一个字符串是普通字符串还是短字符串,我使用了size_t或byte [7]长度的最高有效位。如果byte [7]大于或等于128(或0x80),则为短字符串,字符直接存储在字节中。然后将长度存储在字节[7]的其余位中。

到目前为止,这是理论。正常的字符串位已经实现,我现在正在尝试实现短字符串位。我现在遇到的问题是以下代码:

inline const char* c_str(void) const
    {
        if (compound.bytes.bytes[7] >= 0x80)
            return compound.bytes.bytes;
        return compound.string.m_string;
    }


从Visual Studio观察器中,我知道compound.bytes.bytes [7]是0x82(字符串是“ hi”)。因此它应为0x82> = 0x80,如true并返回字节,但是由于某种原因,此比较为false并返回普通字符串的char *,这当然是虚假指针(精确到0xcc006968)。

还需要指出的是,这种代码对于正常的字符串仍然可以正常工作。

我缺少什么,我在做什么错?

最佳答案

使用带符号的8位整数时,值0x80是负数。因此0x82会更少,因为它也是负数。值0x82转换为-126,值0x80转换为-128,这意味着0x80小于2的补码有符号整数。

将您的数据类型切换为uint8_t

关于c++ - 为什么0x82小于0x80?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41044930/

10-12 03:34