从unsigned Char *转换为unsigned int

时间:2012-04-17 14:57:27

标签: c++ types compiler-errors

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

../ src / Sample.cpp:19:错误:从\ u2018UINT8 * \ u2019转换为\ u2018UINT8 \ u2019失去精确度

#include <iostream>
using namespace std;

typedef unsigned char UINT8;
typedef unsigned int UINT32;

#define UNUSED(X) X=X

int main() {
    UINT8 * a = new UINT8[34];
    UINT32 b = reinterpret_cast<UINT8>(a);

    UNUSED(b);

    return 0;
}

我将如何解决这个问题。请记住,我不是要将字符串转换为unsigned long,而是将char *(ADDRESS值)转换为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;
}

3 个答案:

答案 0 :(得分:3)

假设sizeof(int)== sizeof(void *)您可以使用此代码进行转换:

int b = *reinterpret_cast<int*>(&a);

或其变体。我认为static_cast也可以。

当然必须是l值(能够分配)才能获得它的地址。对于非l值,你需要使用一个函数,好的旧联合技巧将起作用:

int Pointer2Int (void* p)
{
    union { void* p; int i; } converter;
    converter.p = p;
    return converter.i;
}

答案 1 :(得分:1)

这不是一个好主意,但该行应为:

UINT32 b = reinterpret_cast<UINT32>(a);

reinterpret_cast将目标类型的类型作为模板参数。

使用正确的类型g ++会告诉你这不是一个好主意:

error: invalid cast from type ‘char’ to type ‘int’

请参阅Cthutu对更正确方法的回答。

答案 2 :(得分:0)

选项是:

int * a; char b [64]; int c;

a =(int *)malloc(sizeof(int));

sprintf(b,“%d”,a);

c = atoi(b);