我正在为自己的编程语言开发自己的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
。
实际发生了什么以及如何解决?