C++ 从无符号字符*转换为无符号整数
执行以下操作时,会出现此错误: ../src/Sample.cpp:19:错误:从\u2018UINT8*\u2019到\u2018UINT8\u2019的强制转换失去精度 我将如何着手解决这个问题。请记住,我并没有试图将字符串转换为无符号long,而是将地址值char*转换为int 谢谢 解决方案: 事实证明,这个问题与指针大小有关。在32位机器上,指针大小是32位,而对于64位机器,指针大小当然是64位。上述操作在64位机器上不起作用,但在32位机器上起作用。这将在64位机器上工作C++ 从无符号字符*转换为无符号整数,c++,types,compiler-errors,C++,Types,Compiler Errors,执行以下操作时,会出现此错误: ../src/Sample.cpp:19:错误:从\u2018UINT8*\u2019到\u2018UINT8\u2019的强制转换失去精度 我将如何着手解决这个问题。请记住,我并没有试图将字符串转换为无符号long,而是将地址值char*转换为int 谢谢 解决方案: 事实证明,这个问题与指针大小有关。在32位机器上,指针大小是32位,而对于64位机器,指针大小当然是64位。上述操作在64位机器上不起作用,但在32位机器上起作用。这将在64位机器上工作 #inc
#include <iostream>
#include <stdint.h>
using namespace std;
typedef uint8_t UINT8;
typedef int64_t UINT32;
#define UNUSED(X) X=X
int main() {
UINT8 * a = new UINT8[34];
UINT32 b = reinterpret_cast<UINT32>(a);
UNUSED(b);
return 0;
}
一种选择是: int*a; charb[64]; INTC a=int*malloc sizeofint sprintfb,%d,a
c=atoib 一种选择是: int*a; charb[64]; INTC a=int*malloc sizeofint sprintfb,%d,a
c=atoib 假设sizeofint==sizeofvoid*可以使用以下代码转换:
int b = *reinterpret_cast<int*>(&a);
假设sizeofint==sizeofvoid*可以使用以下代码转换:
int b = *reinterpret_cast<int*>(&a);
这不是一个好主意,但应该是这样的:
UINT32 b = reinterpret_cast<UINT32>(a);
有关更正确的方法,请参见Cthutu的答案。这不是一个好主意,但行应该是:
UINT32 b = reinterpret_cast<UINT32>(a);
有关更正确的方法,请参阅Cthutu的答案。您是为32位体系结构编译的吗?请记住,您试图将34字节的数据存储到4字节中。错误说明了一切。@Rowland Shaw,不,它是64位的。是的,我刚刚意识到,感谢代码引起了问题,因为它最初使用的是32位编译器。@Anonymous:如果编译器支持它,您应该使用或中的标准整数类型。特别是,std::uintptr_t保证足够大,可以存储指针值。即使在32位平台上,转换到也不起作用。@Mike Seymour我同意,我切换到32位编译。这就是我一直以来的编译方式。您是为32位体系结构编译的吗?请记住,您试图将34个字节的数据存储到4个字节中。错误说明了一切。@Rowland Shaw,不,它是64位的。是的,我刚刚意识到,感谢代码引起了问题,因为它最初使用的是32位编译器。@Anonymous:如果编译器支持它,您应该使用或中的标准整数类型。特别是,std::uintptr_t保证足够大,可以存储指针值。即使在32位平台上,转换到也不起作用。@Mike Seymour我同意,我切换到32位编译。这就是我应该如何编译整个过程。事实上,正如我在问题中提到的,这不是问题所在。编译器抱怨的精度损失问题。我刚刚发现我正在为64位系统编译。这意味着指针大小为64位,而不是32位。除非我使用64位整数,否则这将不起作用。这就是为什么我说假设sizeofint==sizeofvoid*。当然,如果sizeofint
error: invalid cast from type ‘char’ to type ‘int’