【发布时间】:2012-05-18 17:49:44
【问题描述】:
即如果我们将名为 arr 的 C 或 C++ 无符号字符数组转换为 (unsigned short*)arr 然后分配给它,结果是否与机器字节序无关?
旁注 - 我看到了关于 IBM 和其他地方关于 SO 的讨论:
unsigned char endian[2] = {1, 0};
short x;
x = *(short *) endian;
...表示 x 的值将取决于字节序的布局,因此取决于机器的字节序。这意味着取消引用数组是依赖于字节序的,但是分配给它呢?
*(short*) endian = 1;
无论字节顺序如何,是否所有未来的短解引用都保证返回 1?
阅读回复后,我想发布一些背景信息:
在这个结构中
struct pix {
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char a;
unsigned char y[2];
};
用 unsigned short y 替换 unsigned char y[2] 没有个体差异,但是如果我将这些结构组成一个数组并将其放入另一个结构中,那么我注意到容器结构的大小往往是“无符号短”版本更高,因此,由于我打算制作一个大数组,因此我选择了 unsigned char[2] 以节省空间开销。我不知道为什么,但我想在内存中对齐 uchar[2] 更容易。
因为我需要对变量 y 进行大量数学运算,这意味着它是一个单一的短长度数值,我发现自己为了避免单独访问 uchar 字节而将其转换为 short 很多...排序一种避免丑陋的字节特定数学的快速方法,但后来我想到了字节顺序以及如果我只是将所有内容都转换为这样,我的数学是否仍然正确
*(unsigned short*)this->operator()(x0, y0).y = (ySum >> 2) & 0xFFFF;
...这是一个程序中的一行,它在二维数组中平均 4 个相邻的邻居,但关键是我有一堆需要对 uchar[2] 字段进行操作的操作作为一个单一的短片,我试图找到最轻的(即,每次我需要访问或分配时都没有基于字节序的 if-else 语句),与短片无关的字节序无关方式。
【问题讨论】:
标签: c casting variable-assignment endianness dereference