error: invalid static_cast from type ‘unsigned char*’ to type ‘uint32_t* {aka unsigned int*}’
uint32_t *starti = static_cast<uint32_t*>(&memory[164]);
我已经分配了一个字符数组,我想读取4个字节作为32位int,但是我得到了一个编译器错误。 我知道我可以转移,像这样:
(start[0] << 24) + (start[1] << 16) + (start[2] << 8) + start[3];
它会做同样的事情,但这是一项额外的工作。
是否有可能以某种方式将这四个字节转换为int?
答案 0 :(得分:8)
static_cast
旨在用于&#34;表现良好的&#34;演员表,例如double -> int
。
您必须使用reinterpret_cast
:
uint32_t *starti = reinterpret_cast<uint32_t*>(&memory[164]);
或者,如果你愿意,C风格的演员阵容:
uint32_t *starti = (uint32_t*)&memory[164];
答案 1 :(得分:6)
是的,你可以将unsigned char*
指针值转换为uint32_t*
(使用C风格的演员或reinterpret_cast
) - 但这并不是#39; t表示你必须使用结果。
此类转换的结果可能不会指向正确对齐以容纳uint32_t
对象的地址。例如,unsigned char*
可能指向奇数地址;如果uint32_t
需要对齐,那么当您尝试取消引用结果时,您将会有未定义的行为。
如果您可以保证unsigned char*
指向正确对齐的地址,那么您应该没问题。
答案 2 :(得分:0)
我已经习惯了BDS2006 C ++,但无论如何这应该适用于其他编译器
char memory[164];
int *p0,*p1,*p2;
p0=((int*)((void*)(memory))); // p0 starts from start
p1=((int*)((void*)(memory+64))); // p1 starts from 64th char
p2=((int*)((void*)(&memory[64]))); // p2 starts from 64th char
答案 3 :(得分:0)
您可以按照faranwath的建议使用reinterpret_cast
,但请了解走这条路的风险。
在一个小端系统和一个大端系统中,你所得到的价值将完全不同。您的方法适用于这两种情况。