[英]Can I cast an unsigned char* to an unsigned int*?
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?
static_cast
意味着用于“表现良好”的强制转换,例如double -> int
。 您必须使用reinterpret_cast
:
uint32_t *starti = reinterpret_cast<uint32_t*>(&memory[164]);
或者,如果你愿意,C风格的演员阵容:
uint32_t *starti = (uint32_t*)&memory[164];
是的,您可以将unsigned char*
指针值转换为uint32_t*
(使用C样式转换或reinterpret_cast
) - 但这并不意味着您必须使用结果。
这种转换的结果可能不会指向正确对齐以保存uint32_t
对象的地址。 例如, unsigned char*
可能指向奇数地址; 如果uint32_t
甚至需要对齐,当您尝试取消引用结果时,您将有未定义的行为。
如果你可以保证unsigned char*
确实指向一个正确对齐的地址,你应该没问题。
我已经习惯了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
你可以按照faranwath的建议使用reinterpret_cast
,但请理解走这条路的风险。
在一个小端系统和一个大端系统中,你得到的东西的价值将完全不同。 您的方法将适用于这两种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.