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

これをどのように解決しますか。文字列をunsignedlongに変換しようとしているのではなく、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;
}
4

3 に答える 3

4

sizeof(int)== sizeof(void *)とすると、次のコードを使用して変換できます。

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

またはそのバリエーション。static_castも機能すると思います。

もちろん、そのアドレスを取得するには、aがl値(割り当て可能)である必要があります。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

オプションは次のとおりです。

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

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

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

c = atoi(b);

于 2012-04-17T15:00:22.073 に答える