You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

64位机器下char*转int精度丢失问题求助

64位系统下char*转int的精度丢失问题解决

在64位机器上,sizeof(char*)为8字节,sizeof(int)为4字节,直接将char*强制转换为int时出现精度丢失错误,尝试转long也收到报错:cast from 'char*' to 'int' loses precision。

相关代码如下:

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];

问题根源

你现在的强制转换逻辑完全错误:mysql_fetch_row返回的row是字符串数组,row[0]是指向book_id对应字符串的指针,你直接把这个指针的内存地址转成int/long,而不是把指针指向的字符串内容解析成整数。64位系统下指针是8字节,转4字节int必然丢失精度,就算转long,后续代码里b_id和qty还是int类型,依然会有问题。

正确解决方法

用字符串转整数的函数来解析row里的字符串内容,常用的有:

  • atoi():适合转普通int范围的整数
  • strtol():更安全,支持更大范围的数值,还能做格式校验

修改问题行如下:

// 用atoi的简单写法
b_id[i] = atoi(row[0]);
qty[i] = atoi(row[1]);

如果数据库里的数值可能超过int范围,推荐用strtol:

// 用strtol更安全,支持long类型,再转int(需确保数值在int范围内)
b_id[i] = static_cast<int>(strtol(row[0], nullptr, 10));
qty[i] = static_cast<int>(strtol(row[1], nullptr, 10));

额外提醒

要确保数据库返回的book_id和qty字段确实是整数格式的字符串,如果有非数字内容,需要提前做格式校验,避免转换出错。

内容的提问来源于stack exchange,提问作者Manar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:10:31