即,如果我们将一个名为 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 字节而进行了很多转换......有点快避免丑陋的特定于字节的数学的方法,但后来我想到了字节顺序以及如果我只是将所有内容都转换为,我的数学是否仍然正确
*(unsigned short*)this->operator()(x0, y0).y = (ySum >> 2) & 0xFFFF;
...这是一个程序中的一行,它平均 2-D 数组中的 4 个相邻邻居,但关键是我有一堆需要对 uchar[2] 字段进行操作的操作作为单个短,我试图找到最轻的(即,每次我需要访问或分配时都没有基于字节序的 if-else 语句),与短字节无关的字节序无关方式。