我可以将无符号字符*转换为无符号的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
,但请理解走这条路的风险。
在小端系统和大端系统中,您返回的价值将完全不同。您的方法在这两种情况下都有效。
相关文章:
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 是否可以将无符号 int 的最大值转换为 int 并将结果转换为 -1?
- 为什么QByteArray的大小是"int"而不是"无符号int"
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- 使用无符号int作为二进制来在c++中实现一个集
- C++如何将变量传递给带有无符号 int & 的参数uint16_t函数?
- 为什么我不能使用在 Visual C++ 32 位中实现运算符无符号 int() 作为数组索引的类?
- 视觉C++转换和写入值为 10 的无符号 int 给出 5 个字节
- uint8_t在转换为无符号 int 时未打印正确的值
- G++ 错误:重载的"abs(无符号 int)"的调用不明确
- 将 3D 矢量浮点打包到无符号 int 中并将其解压缩
- 如何使用 JNI 将 double 和无符号 int 从本机 c 库返回到 java
- 为什么printf和cout为此无符号int提供了不同的输出
- memcpy 从无符号字符 * 到无符号 int
- C++ 重载与有符号和无符号 int 不同
- 创建具有未定义溢出的无符号 int
- 将大双精度转换为无符号 int 期间堆栈损坏
- 错误:成员引用基类型"uint32_t"(也称为"无符号 INT")不是结构或联合
- 无符号int的比较始终是正确的(NPOS问题?)