c - unsigned char 的数组声明

标签 c

我有一个问题指出 unsigned char 数组存储 unsigned int,每个 int 仅使用 3 个字节。

为什么我的老师会这样初始化 vector unsigned char s[]="\x12\x34\x78\x9A\xBC\xDE\xFF" 而不是简单地使用整数?我相信这些数字是以十六进制表示的?

最佳答案

可能是因为你的老师对他的内存使用很吝啬。

通过使用 unsigned char 的“打包”数组,每个 24 位整数可以仅使用 24 位存储(假设一个 8 位 char,这我希望这里不会引起很大争议)。

请注意,还选择使用字符串表示法使其在源代码中更加紧凑(尽管可读性较差);第一个整数是 "\x12\x34\x78",在数组表示法中是 0x12, 0x34, 0x78 由于逗号(和空格,当然可以像逗号一样被删除)。

一个可能的折衷方案是利用 C 中相邻字符串文字被连接起来的事实,并将每个 24 位数字写成它自己的字符串:

unsigned char s[] = "\x12\34\x78" "\x9a\xbc\xde";

这样可以更容易地找出每个数字的边界,但当然重复的引号会占用空间。

您可以像这样提取单个整数:

unsigned int unpack24(size_t index)
{
  if(index >= (sizeof s) / 3)
    return 0;
  const unsigned int hi  = s[3 * index];
  const unsigned int mid = s[3 * index + 1];
  const unsigned int low = s[3 * index + 2];
  return low | (mid << 8) | (hi << 16);
}

请注意,上面假设大端数字,因此第一个将解压为 0x123478;我当然不知道这是正确的。

关于c - unsigned char 的数组声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35366041/

相关文章:

c - 我想为我自己的 Linux 内核工作文件夹生成交叉引用

c++ - 读取 mex 文件中的结构数据时发生奇怪的事情

c - 在c程序中用sudo执行shell命令

c - qsort在c中动态创建数组

c - 可变大小消息的 VMIN 和 VTIME 终端设置

十六进制到二进制的转换

c - Linux 模块 __must_check 注解

c - 从 XML C 字符串表示中提取值节点

c - 打印所有素数直到 N

c - 如何在 c 中使用 argc、argv[] 的同时提示用户输入?