字节序
小端:低字节放低地址空间,高字节放高地址空间,小端模式符合读取、理解习惯,大部分MCU、X64 CPU都采用小端
大端:高字节放低地址空间,低字节放高地址空间,大端模式符合书写、拼读、传输习惯,比如网络字节序一般使用大端模式
代码
测试浮点数的存储格式
1 | typedef union { |
测试
调试查看Memory Brownser,16-Bit Hex格式下对应的数据从低到高:0xF979 0x42F6
对应的结果是0x42F6E979
(高字节放高地址空间),按 IEEE 754 单精度浮点格式还原:
- 符号位(1位):
0
0
表示正数,1
表示负数。
- 指数位(8位):
10000101
- 十进制值:
133
(无符号整数),对应的指数为133 - 127 = 6。
- 十进制值:
- 尾数位(23位):
11101101110100101111001
- 隐含前导的
1.
(即实际尾数为1.11101101110100101111001
)。
- 隐含前导的
计算结果跟123.456f
吻合
1 | 1.11101101110100101111001 ≈ 1.929000139 |
可以看到uint16_t能还原原始的数据内容,第一个索引是59769(0xE979),第二个索引是17142(0x42F6)
unsigned char不行,第一个索引是59769(0xE979),第二个索引是17142(0x42F6)2、3索引对应的数据都是0
另外unsigned char直接赋值也会有问题,很明显第三、四个DataUnit8
是取到后面的内存去了
总结
- DSP TMS320F28379D使用小端模式存储数据
- 不能简单用4个unsigned char理解float,但可以用2个uint16_t理解float,用指针强转的朋友留意!