gpt4 book ai didi

c - 强制转换是否会删除 C/C++ 中的字节序依赖性?

转载 作者:行者123 更新时间:2023-12-01 06:16:20 24 4
gpt4 key购买 nike

即如果我们将名为 arr 的 C 或 C++ unsigned char 数组转换为 (unsigned short*)arr 然后分配给它,结果是否与机器字节序无关?

旁注 - 我看到了关于 IBM 和其他地方关于 SO 的讨论以及示例:

unsigned char endian[2] = {1, 0};
short x;
x = *(short *) endian;

...说明 x 的值将取决于字节序的布局,因此取决于机器的字节顺序。这意味着取消引用数组是字节序相关的,但是如何分配给它呢?

*(short*) endian = 1;

无论字节顺序如何,所有 future 的短解引用都保证返回 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 short”版本更高,因此,由于我打算制作一个大数组,所以我使用 unsigned char[2] 来节省空间开销。我不确定为什么,但我想在内存中对齐 uchar[2] 会更容易。

因为我需要用那个变量 y 做大量的数学运算,它意味着是一个单一的短长度数值,我发现自己转换为 short 很多只是为了避免单独访问 uchar 字节......排序一种避免丑陋的特定于字节的数学的快速方法,但后来我想到了字节序以及如果我将所有内容都像这样转换我的数学是否仍然正确

*(unsigned short*)this->operator()(x0, y0).y = (ySum >> 2) & 0xFFFF;

...这是一个程序中的一行,该程序对二维数组中的 4 个相邻元素进行平均,但关键是我有一堆这些操作需要对 uchar[2] 字段进行操作作为一个短片,我试图找到最轻的(即每次我需要访问或分配时都没有基于字节序的 if-else 语句)、字节序无关的短片处理方式。

最佳答案

由于严格的指针别名,它是未定义的行为,所以它可能是任何东西。如果您对 union 执行相同的操作,但答案是否定的,结果取决于机器字节序。

关于c - 强制转换是否会删除 C/C++ 中的字节序依赖性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10529211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com