我正在尝试用C ++编写Matlab Type强制转换函数。在Matlab中,它如下:
>> format long e
>> d=typecast(uint32([65304 47886]), 'double')
d =
1.016138904784275e-309
HEX的位置为
0000bb0e0000ff18
在C ++中,我已经完成了这个
double d = 65304+ ((uint64_t)47886<<32);
std::cout << "d " << "is " << d << std::endl;
d is 2.05669e+14
在HEX中,即0000bb0e0000ff18
那么,为什么我会得到不同的价值?
答案 0 :(得分:2)
您并没有真正对结果进行类型转换,您只是进行类型转换,因此您获得的double值与整数值相同。
如果你想在MATLAB中做一个真正的typecast
,你需要做这样的事情:
unsigned long i = 65304 + ((uint64_t)47886<<32);
// Make the double pointer address the same memory as the integer
double *d = (double *)&i;
std::cout << "d " << "is " << *d << std::endl;
问题在于您将遇到可移植性问题,因为此解决方案要求int类型中的位数精确地等于float类型中的位数。
结果(在我的机器上):
d is 1.01614e-309
答案 1 :(得分:1)
如果您查看C ++代码中的操作,您将看到只有两个整数值的总和:
double d = 65304 + ((uint64_t)47886<<32);
--> d = 65304 + 205668803936256;
--> d = 205668804001560
这是您在代码中获得的结果。因此,如果要将此值解释为藐蹦点号,则必须将此十六进制值转换为浮点编码
Double-precision floating-point format
也许演员阵容不足以取得你的成绩。而且你必须直接从十六进制格式中读取符号,指数和分数的位。