1

当我执行以下操作时,我收到此错误:

../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;
}

我将如何解决这个问题。请记住,我不是试图将字符串转换为无符号长整数,而是将 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;
}
4

3 回答 3

4

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

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

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

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

int Pointer2Int (void* p)
{
    union { void* p; int i; } converter;
    converter.p = p;
    return converter.i;
}
于 2012-04-17T15:00:35.770 回答
1

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

UINT32 b = reinterpret_cast<UINT32>(a);

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

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

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

有关更正确的方法,请参阅 Cthutu 的答案。

于 2012-04-17T15:01:30.033 回答
0

一种选择是:

诠释*一个;字符 b[64]; 诠释 c;

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

sprintf(b, "%d", a);

c = atoi(b);

于 2012-04-17T15:00:22.073 回答