我理解了如何在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');
Run Code Online (Sandbox Code Playgroud)
然后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
Run Code Online (Sandbox Code Playgroud)
这意味着-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;
Run Code Online (Sandbox Code Playgroud)
我不能把a和b作为65304和47886.
值-0.0022正在转换为两个16位值,这意味着您的值是单个(不是双精度)类型.
让我们尝试相反的方式
>> typecast(uint16([65304 47886]), 'single')
ans =
-0.0022
Run Code Online (Sandbox Code Playgroud)
现在让我们看看这些值的十六进制表示如下:
>> format hex
>> uint16([65304 47886])
ans =
ff18 bb0e
>> d=typecast(uint16([65304 47886]), 'single')
d =
bb0eff18
Run Code Online (Sandbox Code Playgroud)
现在您看到第一个值65304是LSB 16位,47886是16位MSB.因此,您的C++实现是正确的.您在C++中未获得正确值的原因是该值不完全等于-0.0022.由于您的环境使用默认值format,因此short您看不到所有有效数字.如果你试试这个
>> format long e
>> typecast(uint16([65304 47886]), 'single')
ans =
-2.1819528e-003
Run Code Online (Sandbox Code Playgroud)
或者在您的环境中使用
>> format long e
>> A(1)
Run Code Online (Sandbox Code Playgroud)
您在数组中找到实际值,并在C++代码中使用它,应该返回正确的值.