繁体   English   中英

我可以将unsigned char *转换为unsigned int *吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM