1

在 C(使用 gcc)中,是否可以使用 4 char [az] “literal”(例如 "enus"/{'e','n','u','s'}/... )作为一个 uint16_t ?

我希望能够在我的代码中直接使用 4 字符语言环境(例如 'en-us',但 'enus' 也可以,因为 '-' 是多余的 afaik)作为无符号 16 位整数直接在我的代码中使用运行时开销。

例如,'en-us' 可以映射到 (('e' - 96) << 12) | (('n' - 96) << 8) | (('u' - 96) << 4) | ('s' - 96)。(这只是一个例子,我可以使用任何至少保持值 0 不变的映射/算法(用于检测“无设置”))

任何解决方案都不需要是可移植的(WRT 字节序等),但应该没有实际使用 uint16_t 的运行时开销。

非常感谢你!

PS:随意为问题添加更多标签,不知道除了“c”之外还能使用什么。谢谢。

4

3 回答 3

2

GCC 文档中指定了多字符常量的处理。GCC 通过将前一个值左移每个字符的位数并对新字符进行 OR 运算来评估多字符常量。

当目标使用 8 位字符(今天最常见)时,四个字符将不适合uint16_t. 要使用 a uint16_t,您需要定义自己的从一些文字到 a 的映射uint16_t

于 2013-09-18T14:56:36.213 回答
1

您可以在 16 位整数中编码 4 个 4 位值。使用 4 位,您可以编码 16 个不同的字符。

当然,如果您可以选择如何对每个字符进行编码,则可以将“enus”编码为 16 位整数,但不能对每个 4 字母字符串进行编码。英文有超过 16 个字母,所以有些字母无法表示。

于 2013-09-18T15:01:11.977 回答
0

我唯一能想到的就是简单地将uint16_t用作表(字符串或其他)的索引。如果您不受内存限制,那么您可以轻松地做到这一点,而且开销很小。

于 2013-09-18T15:03:06.343 回答