c++ - 使用 reinterpret_cast 从 char* 返回 long long

标签 c++ bit reinterpret-cast

我有以下代码:

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;

此程序打印 40507659919799875053544952156018063160,无论您使用的是小端还是大端架构。那是因为:

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/

相关文章:

c++ - 为什么指定的初始化程序在 C++ 中工作?

c++ - 编译器会自动优化对数学函数的重复调用吗?

algorithm - 枚举位向量使得不会同时设置两个相邻位的有效方法

c++ - 用作对象的封装字符数组是否违反严格的别名规则

c++ - 如何检查迭代器是否形成连续的内存区域?

C++11:将结构数组重新解释为结构成员数组

c++ - 在给定的世界坐标处修改网格上的纹理

c++ - 发送广播winsock c++

go - 在 Go 中解压 redis 设置位字符串

c++ - 手动更改 unsigned int 中的一组字节