我正在尝试优化大学课程练习的字符串课程。普通字符串被存储为char*,长度为size_t。sizeof(字符串)为8,应该保持这样的保留。但是,如果我只有7个或更少的字符串(或者考虑到null终结器),而不是使用指针直接将它们存储在指针/size_t字节中。
为此,我有两个结构,一个用于char*和size_t,一个带有8个字符(字节)的数组。我两个都放在工会中,并给弦乐类是所述工会的成员。
要确定字符串是正常的字符串,还是一个简短的字符串,我使用了长度size_t或字节中最重要的位[7]。如果字节[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 Watcher,我知道compound.bytes.bytes [7]为0x82(字符串为" hi")。因此,它应该像true一样为0x82> = 0x80并返回字节,但是由于某种原因,此比较会变错并返回普通字符串的字符*,这当然是伪造的指针(确切的0xcc006968)。<</p>还值得指出的是,此非常适合正常字符串。
我想念什么,我在做什么错?
使用>签名的8位整数时值0x80是负数。因此,0x82会较小,因为它也为负。值0x82转换为-126和0x80,转化为-128,这意味着0x80在二的互补整数中小于0x82 strong>。
将数据类型切换为uint8_t
。
char*签名为0x80及以后的是负
您正在使用签名值(char)。因此,0x80表示-128和0x82表示-126。此代码可能会根据需要工作:
inline const char* c_str(void) const
{
if (static_cast<unsigned char>(compound.bytes.bytes[7]) >= 0x80u)
return compound.bytes.bytes;
return compound.string.m_string;
}
您将签名的char(0x82 = -126)与签名的int(0x00000080 = 128)进行比较。签名的char可以是-128至127的数字,因此它将始终小于128。