首页 > 解决方案 > llvm:将 i8* 类型值转换为 double 类型值

问题描述

我有一个 char 指针 (Type::getInt8PtrTy(Context) ) 并尝试将保存该指针的值( 换句话说,字符串) 转换为双精度类型 (Type::getDoubleTy(Context))。我尝试的方法是:

Value* stringValue = ... // Value which type Type::getInt8PtrTy(Context)
auto doubleValue = CastInst::CreatePointerCast(stringValue, Type::getDoubleTy(Context), Builder.GetInsertBlock());
AllocaInst *alloca = .. //alloc memory for element which type is Type::getDoubleTy(Context)
Builder.CreateStore(doubleValue, alloca);

问题是当我尝试使用外部 C 函数 (printf) 打印 doubleValue 时,看起来我得到了地址但没有 double 值。换句话说,我想编写与 C atoi 函数一样的代码。我正在使用 C++ API。

我将不胜感激。

标签: c++llvm

解决方案


atoi不只是将变量转换为不同的类型。它实际上是通过某种算法将字符串值转换为整数。

如果你想做同样的事情,你必须在你的位码中包含一个实现该算法的函数,然后call在你的指针上使用指令来获取double值。

如果您真的想将字符串的数据解释为双精度,请使用bitcast将指针从i8*to 转换为double*然后使用load指令。


推荐阅读