C++ Matlab中的typecast

C++ Matlab中的typecast,c++,matlab,C++,Matlab,我理解了Matlab中帮助文件中typecast的解释。 但我无法应付我的结果。我试着按如下方式键入一个3x4矩阵 A= -0.0022 -87.8788 -96.2848 -96.9586 0.9891 -52.9250 -52.7722 -52.7780 0.1473 -4.8680 -6.0184 -5.9894 ANS = typecast(A(:), 'uint16'); 然后ANS向量变成 ANS=65304 47886 1

我理解了Matlab中帮助文件中typecast的解释。 但我无法应付我的结果。我试着按如下方式键入一个3x4矩阵

A= -0.0022  -87.8788  -96.2848  -96.9586
    0.9891  -52.9250  -52.7722  -52.7780
    0.1473   -4.8680   -6.0184   -5.9894

ANS = typecast(A(:), 'uint16');
然后ANS向量变成

ANS=65304
    47886
    13518
    16253
    55853
    15894
    49650
    49839
    45875
    49747
    50835
    49307
    37329
    49856
     5820
    49747
    38546
    49344
    60110
    49857
     7340
    49747
    43369
    49343
这意味着-0.0022有两个16位值65304和47886。 如何计算? 那么我如何在C++中实现呢? 在C++中,我实现了类似

float f = -0.0022;
unsigned short a = static_cast<unsigned int>(f);
unsigned short b = static_cast<unsigned int>(f)>>16;
float f=-0.0022;
无符号短a=静态_转换(f);
无符号短b=静态_转换(f)>>16;

我不能将a和b设为65304和47886。

值-0.0022正在转换为两个16位的值,这意味着您的值是single(而不是double)类型

让我们换一种方式试试

>> typecast(uint16([65304 47886]), 'single')

ans =

   -0.0022
现在让我们看看这些值的十六进制表示形式如下:

>> format hex
>> uint16([65304 47886])

ans =

   ff18   bb0e

>> d=typecast(uint16([65304 47886]), 'single')

d =

   bb0eff18
现在您看到第一个值65304是LSB 16位,47886是16位MSB。因此,C++实现是正确的。在C++中没有得到正确的值的原因是,该值不完全等于-0.00。由于您的环境使用默认的
short
,因此您看不到所有有效数字。如果你试试这个

>> format long e
>> typecast(uint16([65304 47886]), 'single')

ans =

  -2.1819528e-003
或者在您的环境中使用

>> format long e
>> A(1)

你发现数组中的实际值,并在C++代码中使用它,应该返回正确的值。

但是仍然缺少一些东西。如果我尝试C++中的浮点F= -8787.999 E+ 001;无符号短a=静态_转换(f);无符号短b=静态_转换(f)>>16;我有65449和65535。然后我做了typecast(uint16([65449 65535]),“single”),我得到了NaN。@batuman我想你需要使用
重新解释cast
而不是
静态cast
。准确地看这个问题。我喜欢浮点数f=-8.78799e+001;无符号短a=*重新解释铸件(&f);无符号短b=*重新解释铸件(&f)>>16;结果与Matlab中的结果一致。