一个无符号字符数组的声明

3

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

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

1个回答

9
因为你的老师可能对内存使用很吝啬。
通过使用“紧凑”数组的无符号字符,每个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;我当然不知道这是否正确。

你如何将一个整数重新变回原来的形式?就像“解包”一样? - Bart Friederichs
非常感谢!那真的帮了我很多 :) - Ionescu Roxana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接