单片机/MCU论坛
直播中

独当一面

11年用户 877经验值
擅长:可编程逻辑
私信 关注
[问答]

想实现unsigned char和double的转换,为什么DSP仿真一直不对?

请教数据类型转换问题,处理器类型:ADSP21479,编译器visual DSP 5.0。
想实现unsigned char和double的转换(因为从外部接口接收到的是unsigned char)。转换方法如下
typedef union{
                       double d;
                       unsigned char c[8];
                       } fc_convert;
fc_convert fc;
fc.c[0] = 0xD3;
fc.c[1] = 0x44;
fc.c[2] = 0x6F;
fc.c[3] = 0x51;
fc.c[4] = 0x72;
fc.c[5] = 0x06;
fc.c[6] = 0x43;
fc.c[7] = 0x40;
double tempd =0.0;
tempd = fc.d;
通过matlab将char转换成double应该为38.050363711672297。
但是DSP仿真一直不对。

回帖(1)

h1654155275.5741

2024-1-11 17:18:16
根据您提供的代码,我注意到您使用了一个union来实现unsigned char和double的转换。但是,在这种情况下,您需要确保unsigned char数组的字节顺序与您的处理器的字节顺序相匹配。

由于您正在使用ADSP21479处理器,它是一个Little-Endian处理器,所以您需要确保union中的unsigned char数组的字节顺序也是Little-Endian。

例如,如果您收到的unsigned char数组是按照Big-Endian字节顺序排列的,则可以按照以下方式进行转换:

```cpp
typedef union{
    double d;
    struct{
        unsigned char c7;
        unsigned char c6;
        unsigned char c5;
        unsigned char c4;
        unsigned char c3;
        unsigned char c2;
        unsigned char c1;
        unsigned char c0;
    }c;
} Converter;

Converter converter;
converter.c.c0 = receivedCharArray[7];
converter.c.c1 = receivedCharArray[6];
converter.c.c2 = receivedCharArray[5];
converter.c.c3 = receivedCharArray[4];
converter.c.c4 = receivedCharArray[3];
converter.c.c5 = receivedCharArray[2];
converter.c.c6 = receivedCharArray[1];
converter.c.c7 = receivedCharArray[0];

double convertedValue = converter.d;
```

这样可以确保通过union进行的unsigned char数组和double的转换在Little-Endian处理器上是正确的。

此外,请注意,使用union进行数据类型转换可以引入一些平台依赖性和字节顺序问题。建议在使用union时要格外小心,并确保在不同处理器上测试和验证正确性。

希望这对您有帮助!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分