使用reinterpret_cast从char*返回long long
Using reinterpret_cast to return long long from char*
我有以下代码:
char* p = "12345";
long long x = *reinterpret_cast<long long*>(p);
和我一直得到228509037105 x
-我期待12345。
我做错了什么?
更新:由于我最初的理解,我问错了问题。然而,从我后来被告知有可能从使用reinterpret_cast
的字符数组读取8个字节!毕竟,无论位是指向一个值还是指向一个指针,它们在位级别上都是一样的!
指针的reinterpret_cast
强制编译器以不同的数据类型重新解释内存地址。要将字符串"12345"
转换为长12345
,您需要转换数字:
#include <sstream>
long long str2ll(const char* p) {
std::sstream ss;
ss << p;
long long r;
ss >> r;
return r;
}
正如chris在评论中所说,在c++ 11中你可以使用std::stoll
:
const char* p = "12345";
long long n = std::stoll(std::string(p));
更新:您可以从8字节的内存中读取long long
,但是字符串"12345678"重新解释为long long
指针将不会是整数"12345678",但取决于您的架构的端序:
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
的十六进制表示。
您误解了reinterpret_cast的用法。请阅读reinterpret_cast的文档页面。
函数的作用如下:char* p = "12345";
行创建了一个名为p
的指向字符的指针变量,该变量指向一个内存区域,该区域包含一个用6字节