我理解了如何在Matlab的帮助文件中解释类型转换。 但无法应付我的结果。我尝试按照以下方式对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;
我不能将a和b作为65304和47886。
答案 0 :(得分:8)
值-0.0022正在转换为两个16位值,这意味着您的值是单个(不是双精度)类型。
让我们尝试相反的方式
>> 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.0022。由于您的环境使用short
的默认format
,因此您看不到所有有效数字。如果你试试这个
>> format long e
>> typecast(uint16([65304 47886]), 'single')
ans =
-2.1819528e-003
或在您的环境中使用
>> format long e
>> A(1)
您在数组中找到实际值,并在C ++代码中使用它,应该返回正确的值。