我可以将无符号字符*转换为无符号的int*吗?

Can I cast an unsigned char* to an unsigned int*?

本文关键字:无符号 int 转换 字符 我可以      更新时间:2023-10-16
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,但请理解走这条路的风险。

在小端系统和大端系统中,您返回的价值将完全不同。您的方法在这两种情况下都有效。