This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TMS320F28023:我缺少什么、左移位

Guru**** 2522770 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/828635/compiler-tms320f28023-what-am-i-missing-bit-shift-left

器件型号:TMS320F28023

工具/软件:TI C/C++编译器

我有以下代码片段:

void To523 (float param_dec、uint16* param_hex){
long param223;
long param227;

#define One_23 0x000#define
One_27 0x800000000 param_dec

= param_dec *(1L << 23);//将十进制数乘以2^
^23 (浮点数转换为 long) param_dec = param_dec *(param_dec 1) param_dec *(1) param_dec 23);param23 (将十进制数乘以 float

这里是生成的汇编代码...

32 param223 = param_dec *(1L << 23);//将十进制数乘以2^23 (将浮点型转换为长整型)
3f1234:9A00 MOVB AL、#0x0
3f1235:28A84B00 MOV @AH、#0x4b00
3f1237:1E42 MOVL *-SP[2]、ACC
3f1238:0644 MOVL ACC、*- SP[4]
3f1239:767F2A41 LCR FS$$MPY
3f123b:767F2B78 LCR FS$$TOL
3f123d:1E48 MOVL *-SP[8]、ACC
33 param223 = param_dec *(One_23);//将十进制数乘以2^23 (将浮点型转换为长整型)
3f123e:9A00 MOVB AL、#0x0
3f123f:28A84B00 MOV @AH、#0x4b00
3f1241:1E42 MOVL *-SP[2]、ACC
3f1242:0644 MOVL ACC、*- SP[4]
3f1243:767F2A41 LCR FS$MPY
3f1245:767F2B78 LCR FS$$TOL
3f1247:1E48 MOVL *-SP[8]、ACC

您将看到两个 C 指令编译为相同的代码、这很好、编译器注意到1L << 23是一个常数。

但是、我的问题是、"前2条汇编指令不应该将0x800000加载到 ACC 中? 我看到正在加载0x4b000000。 为什么?

谢谢、Mark。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="cool Javelin">前2条汇编指令是否不应在 ACC 中加载0x800000? 我看到正在加载0x4b000000。 为什么?[/报价]

    因为表达式的所有类型更改都是显式的,所以表达式是...

    param223 =(long)(param_dec *(float)(1L << 23)); 

    当整数值(1L << 23)转换为32位 IEEE 浮点表示法时、该值的二进制位构成十六进制字符串0x4B000000。   

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    乔治:

    我现在明白了。

    我正在尝试将浮点系数转换为定点(5.23)整数、以便在 ADAU1701中使用。

    我有一些来自 Analog Devices 的示例 C 代码。 我需要做更多的研究、并与他们一起了解更多信息。 他们的代码在1之后没有'L'、因此我的编译器将1视为16位数字。 我开始想知道示例代码。

    虽然我在编码方面具有丰富的经验、但我使用浮点(以及更大的双精度数)的经验有限。 这已添加到我的学习曲线中。

    感谢您的提示。 我将尝试记住编译器如何在公式中转换内容。

    标记。