无符号字符的数组声明

时间:2016-02-12 15:17:13

标签: c

我遇到一个问题,即unsigned char数组存储unsigned int个,int只使用3个字节。

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

1 个答案:

答案 0 :(得分:9)

因为你的老师可能会吝啬他的记忆力。

通过使用unsigned char s的“压缩”数组,每个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);
}

请注意,上面假设为big-endian数字,因此第一个将解包为0x123478;我当然不知道这是对的。