【发布时间】:2012-04-28 22:29:10
【问题描述】:
当我执行以下操作时,我收到此错误:
../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;
}
【问题讨论】:
-
您是否正在为 32 位架构进行编译?
-
请记住,您正在尝试将 34 个字节的数据存储到 4 个字节中。错误说明了一切。
-
@Rowland Shaw,不,它是 64 位的,是的,刚刚意识到感谢代码导致了问题,因为它最初使用的是 32 位编译器。
-
@Anonymous:如果您的编译器支持它,您应该使用来自
<cstdint>或<stdint.h>的标准整数类型。特别是,std::uintptr_t保证足够大以存储指针值。即使在 32 位平台上,也无法转换为<UINT8>。 -
@Mike Seymour 我同意,我切换到 32 位编译。这就是我一直认为的编译方式。
标签: c++ types compiler-errors