c++ 从“char*”到“int”的强制转换会丢失精度

mepcadol  于 2023-01-03  发布在  其他
关注(0)|答案(3)|浏览(188)

我有一个问题转换一个char* 到一个64位机器的am int.我知道这个问题是在64位sizeof(char*)是8和sizeof(int)是4.这里的代码:

void books::update()
{
    int b_id[100],qty[100],i=0,max;
    stmt.str("");
    stmt<<" Select book_id,qty from purchase where recieves ='T' and inv IS NULL;";
    query=stmt.str();
    q =query.c_str();
    mysql_query(conn,q);
    res_set=mysql_store_result(conn);
    stmt.str("");
    stmt<<" Update purchases set inv=1 where recieves ='T' and inv is NULL";
    query=stmt.str();
    q=query.c_str();
    mysql_query(conn,q);
    while((row=mysql_fetch_row(res_set))!=NULL)
    {
        b_id[i]=(int)row[0];
        qty[i]= (int)row[1];
        i++;
    }
    max=i;
    for(i =0;i<max;i++)
    {
        stmt.str("");
        stmt<<" update books set qty ="<< qty[i]<<"where id = "<<b_id[i]<<";";
        query= stmt.str();
        q= query.c_str();
        mysql_query(conn,q);

    }
    cout<<" The order recieved has been updated .";


}

错误在这两行中:

b_id[i]=(int)row[0];
qty[i]= (int)row[1];

我尝试使用(long)而不是(int),期望它将我的int从4字节转换为8字节,但我仍然得到相同的错误(从'char*'转换为'int'会丢失精度)

sbdsn5lh

sbdsn5lh1#

标准库有两个固定宽度的typedef,能够保存指向void的指针,这些指针在<cstdint>中定义:

std::intptr_t   // signed
std::uintptr_t  // unsigned

但是,不能通过强制转换将C字符串转换为整数。必须以某种方式解释C字符串。例如:

#include <sstream>

// ...

// put the two C strings in an istringstream:
std::istringstream is(std::string(row[0]) + ' ' + std::string(row[1]));

// and extract the values
if(is >> b_id[i] >> qty[i]) {
    // success
}

其他选项包括使用std::stoistd::strtol。例如:

b_id[i] = std::stoi(row[0]); // may throw std::invalid_argument ...
qty[i] = std::stoi(row[1]);  // ... or std::out_of_range
tyg4sfes

tyg4sfes2#

将所有地方的int更改为std::intptr_t,包括数组声明。
关于C++中整数类型的更多信息:https://en.cppreference.com/w/cpp/types/integer

wn9m85ua

wn9m85ua3#

您需要一个long long,而不是long来执行转换。但我怀疑这根本不能解决您的问题。

相关问题