我有
const uint8_t longByteTable[16][256][16] = { { { 0x00, ... } } };
声明为硬编码八位字节值的三维16x256x16数组。
出于优化目的和其他各种原因,我需要将此数组解释为uint64_t值的三维16x256x2数组:
const uint64_t reinterpretedTable[16][256][2];
我需要的是在严格的ISO / ANSI C 中 longByteTable
reinterpretedTable
的有效方法 。是这样的:
const uint64_t (*reinterpretedTable)[256][2] =
(const uint64_t(*)[256][2])longByteTable;
这样做的正确方法?
P.S。我不能用后一种类型声明longByteTable
,因为它不能正确地使用不同的字节顺序,我要么需要为不同的字节序声明不同的表,要么执行一些运行时检查和旋转。是的,重新解释数组的所有进一步转换都是字节不变的。
答案 0 :(得分:2)
由于C的指针别名规则,您无法进行此类强制转换。唯一安全的方法是使用联合:
RadioButtonList
虽然请注意,这仍然会使您的代码依赖于endianess。使代码endianess-indepentent的唯一方法是使用位移为大型整数类型赋值。