C++ 从无符号字符*转换为无符号整数

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

执行以下操作时,会出现此错误:

../src/Sample.cpp:19:错误:从\u2018UINT8*\u2019到\u2018UINT8\u2019的强制转换失去精度

我将如何着手解决这个问题。请记住,我并没有试图将字符串转换为无符号long,而是将地址值char*转换为int

谢谢

解决方案:

事实证明,这个问题与指针大小有关。在32位机器上,指针大小是32位,而对于64位机器,指针大小当然是64位。上述操作在64位机器上不起作用,但在32位机器上起作用。这将在64位机器上工作

#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. 抱歉。@Skippy谢谢,但正如我在问题中提到的,请记住,我不是要将字符串转换为无符号长字符串,而是要将地址值char*转换为int。然后我指的是%x而不是%d。很抱歉
error: invalid cast from type ‘char’ to type ‘int’