通过IO将Java Double转换为C ++ Double

时间:2019-05-13 12:07:49

标签: java c++ io double

我正在为自己的编程语言开发自己的VM。编译器使用Java,VM使用c ++。我让编译器写两次,然后让VM正确读取它。
但是,我总是会比原点多一倍。

环境是Mac OS Mojave,架构为i386,x86_64。

这是我为编译器(在 Java 中)所做的操作,以使其写入双精度字:

    public static void putLong(byte[] b, int off, long val) {
        b[off + 7] = (byte) (val       );
        b[off + 6] = (byte) (val >>>  8);
        b[off + 5] = (byte) (val >>> 16);
        b[off + 4] = (byte) (val >>> 24);
        b[off + 3] = (byte) (val >>> 32);
        b[off + 2] = (byte) (val >>> 40);
        b[off + 1] = (byte) (val >>> 48);
        b[off    ] = (byte) (val >>> 56);
    }

    public static void putDouble(byte[] b, int off, double val) {
        putLong(b, off, Double.doubleToLongBits(val));
    }

以及以下内容(在 C ++ 中),使其显示为:

template<typename R>
inline R getBE(std::vector<char> b, int off, int size){
    R r=0;
    int bit=0;
    //std::cout<<"Doing BitUtils::get: " << b <<std::endl;
    for(int i=0;i<size;inc i,bit+=8){
        int bitr=(int)b[i];
        //std::cout<<"BitR: " <<bitr << ", Offset: " << (off + i) <<std::endl;
        if(i!=0)bitr&=0xFF;
        //std::cout<<"BitR bitand 0xFF: "<<bitr<<std::endl;
        r+=(bitr lshift bit);
        //std::cout<<"Shift: "<<bit<<" to " << r<< " with " << bitr << std::endl;
    }
    return r;
}
inline double getDouble(std::vector<char> b, int off) {
        return getBE<double>(b,off,8);
}

使用以下代码,当我尝试编写1.5并读取它时,我得到了-4.00396e+09。 实际发生了什么以及如何解决?

0 个答案:

没有答案