字节序

小端:低字节放低地址空间,高字节放高地址空间,小端模式符合读取、理解习惯,大部分MCU、X64 CPU都采用小端

大端:高字节放低地址空间,低字节放高地址空间,大端模式符合书写、拼读、传输习惯,比如网络字节序一般使用大端模式

代码

测试浮点数的存储格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef union {
float DataFloat;
uint16_t DataUint16[2];
unsigned char DataUint8[4];
} FloatUnion;

void main(void)
{
FloatUnion fu;
fu.DataFloat = 123.456f;
uint16_t val1 = fu.DataUint16[0];
uint16_t val2 = fu.DataUint16[1];
unsigned char val3 = fu.DataUint8[0];
unsigned char val4 = fu.DataUint8[1];
unsigned char val5 = fu.DataUint8[2];
unsigned char val6 = fu.DataUint8[3];

}

测试

调试查看Memory Brownser,16-Bit Hex格式下对应的数据从低到高:0xF979 0x42F6

img

对应的结果是0x42F6E979(高字节放高地址空间),按 IEEE 754 单精度浮点格式还原:

  • 符号位(1位)0
    • 0 表示正数,1 表示负数。
  • 指数位(8位)10000101
    • 十进制值:133(无符号整数),对应的指数为133 - 127 = 6。
  • 尾数位(23位)11101101110100101111001
    • 隐含前导的 1.(即实际尾数为 1.11101101110100101111001)。

计算结果跟123.456f吻合

1
2
1.11101101110100101111001 ≈ 1.929000139
1.929000139 × 2^6 = 1.929000139 × 64 ≈ 123.456

可以看到uint16_t能还原原始的数据内容,第一个索引是59769(0xE979),第二个索引是17142(0x42F6)

img

unsigned char不行,第一个索引是59769(0xE979),第二个索引是17142(0x42F6)2、3索引对应的数据都是0

img

img

img

img

另外unsigned char直接赋值也会有问题,很明显第三、四个DataUnit8是取到后面的内存去了

image-20250521135132771

总结

  • DSP TMS320F28379D使用小端模式存储数据
  • 不能简单用4个unsigned char理解float,但可以用2个uint16_t理解float,用指针强转的朋友留意!

© 2025 hywing 使用 Stellar 创建
总访问 113701 次 | 本页访问 326