我有以下代码:
char* p = "12345";
long long x = *reinterpret_cast<long long*>(p);
x
我一直得到 228509037105 - 我期待 12345。
我做错了什么?
更新:
由于我的初步理解,我把问题问错了。然而,据我后来得知,可以使用 reinterpret_cast
从 char 数组中读取 8 个字节!毕竟,无论位构成一个值还是一个指针,它们在位级别上都是一样的!
最佳答案
指针的reinterpret_cast
强制编译器以不同的数据类型重新解释 内存地址。要将字符串 "12345"
转换为 long long 12345
,您需要转换数字:
#include <sstream>
long long str2ll(const char* p) {
std::sstream ss;
ss << p;
long long r;
ss >> r;
return r;
}
正如克里斯在评论中所说,在 C++11 中你可以使用 std::stoll
:
const char* p = "12345";
long long n = std::stoll(std::string(p));
更新:您可以从 8 个字节的内存中读取一个 long long
,但是字符串“12345678”被重新解释为一个 long long
指针不会是整数“12345678”,而是取决于 endianess of your architecture :
const char* p = "12345678";
long long n = *reinterpret_cast<const long long*>(p);
std::cout << n << std::endl;
此程序打印 4050765991979987505
或 3544952156018063160
,无论您使用的是小端还是大端架构。那是因为:
hex(4050765991979987505) = 0x38 37 36 35 34 33 32 31
hex(3544952156018063160) = 0x31 32 33 34 35 36 37 38
0x38
是 ASCII 数字 8
的十六进制表示。
关于c++ - 使用 reinterpret_cast 从 char* 返回 long long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24887179/