C++错误:从“int*”转换为“int”会失去精度

C++ error: cast from ‘int*’ to ‘int’ loses precision

本文关键字:int 精度 失去 转换 错误 C++      更新时间:2023-10-16

我几天前开始学习C++。

我想编译此示例程序,以便在C++中嵌入Python。

C++程序是:

#include <Python.h>
#include <iostream>
#define pi 3.141592653589793
using namespace std;
int main () {
    //Inicio el interprete Python e imprimo informacion relevante
    Py_Initialize();
    PyObject *FileScript;
    FileScript = PyFile_FromString("script.py","r");
    PyRun_SimpleFile(PyFile_AsFile(FileScript),"r");
    PyObject *retorno, *modulo, *clase, *metodo, *argumentos, *objeto;
    int *resultado;
    modulo = PyImport_ImportModule("script");
    clase = PyObject_GetAttrString(modulo, "Numeros");
    argumentos = Py_BuildValue("ii",5,11);
    objeto = PyEval_CallObject(clase, argumentos);
    metodo = PyObject_GetAttrString(objeto, "suma");
    argumentos = Py_BuildValue("()");
    retorno = PyEval_CallObject(metodo,argumentos);
    PyArg_Parse(retorno, "i", &resultado);
    cout<<"Result is: "<<int(resultado)<<endl;
    Py_Finalize();
    char terminar;
    cin>>terminar;
    return 1;
}

而python脚本"script.py"是:

class Numeros:
    def __init__(self, num1, num2):
        self.num1=num1
        self.num2=num2
    def suma(self):
        print self.num1, self.num2
        return self.num1+self.num2

我正在使用安装了 G++ 的 Ubuntu。我输入这个来编译:

g++ -I/usr/include/python2.7 -lpython2.7 main.cpp -o main

但是我收到此错误:

main.cpp:27:42: error: cast from ‘int*’ to ‘int’ loses precision [-fpermissive]
  cout<<"Result is: "<<int(resultado)<<endl;

我该如何解决?非常坦克你!

指针的大小可能大于 int 的大小,并且取决于内存模型。

int iSomeValue = 0;
std::cout << "size of int = " << sizeof(iSomeValue)<< " | size of pointer = " << sizeof(&iSomeValue);

对于 Visual Studio 2013,Win32 输出为:

整数大小 = 4 | 指针大小 = 4

对于 Visual Studio 2013 x64,输出为:

整数大小 = 4 | 指针大小 = 8

对于 64 位机器,将 int 指针(十六进制格式(转换为 int 值或将 char 指针转换为 int 值是很棘手的,因为 int 变量的每个内存块都是 32 位,对于 char 是 8 位。例如:

1. char SomeString[] = "Hello!";
2. char *pString = SomeString;
3. cout << "pString = " << pString << endl;
4. char *pLocation3 = &SomeString[3];
5. cout << "pLocation3 = " << (int)pLocation3 << endl;

你会得到一个错误:从"char*"转换为"int"会失去精度[-fallowive]

为了在第 5 行而不是 (int(pLocation3 中解决这个问题,我们必须使用 (int64_t(pLocation3 作为可兼容的 64 位机器。