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
相关产品推荐
相关产品推荐

