我有一个问题指出 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/