哪个更好? int8_t vs 32位MCU中的int32_t

时间:2015-06-12 18:03:51

标签: c arm microcontroller 8051

假设有

function f(int8_t a, int8_t b) //  a b only need 8 bits

另一种选择是:

function f(int32_t a, int32_t b) // a b only need 8 bits

它在32位MCU中运行,如ARM Cortex_M。哪个是关于所需代码大小,数据大小和执行效率的更好选择?

如果在8位MCU(例如8051)中,int8_t应该更好,对吧?

4 个答案:

答案 0 :(得分:7)

C为stdint.h提供了更多类型,您可以假设在编译器实现级别上回答了问题。摘自C99草案:

7.20.1.3最快的最小宽度整数类型

1以下每种类型都指定一个通常运行最快的整数类型 在所有至少具有指定宽度的整数类型中。

2 typedef名称int_fastN_t指定带宽度的最快有符号整数类型 至少为N.typedef名称uint_fastN_t指定最快的无符号整数 宽度至少为N的类型。

3需要以下类型: int_fast8_t int_fast16_t int_fast32_t int_fast64_t uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t

因此,只要在您的架构中定义它们,只需使用int_fast8_t(或uint_fast8_t

答案 1 :(得分:1)

如果使用8位值,实际上可能会产生在操作后将该值掩盖回8位的惩罚...如果您的寄存器是32位并且使用32位值没有任何害处,那么只需使用他们...

答案 2 :(得分:1)

花费您的精力和精力,使代码更容易理解,以供将来的开发人员使用。不要担心为编译器或CPU简化操作。使用使意图和/或抽象的类型对于未来的开发人员来说最清楚。

如果函数参数的位宽不重要,则使用int(或unsigned int)。位宽无关紧要的示例可能包括局部变量和循环计数器。如果参数值必须是某个位宽,则使用uint8_tuint16_tuint32_t。当变量表示外设寄存器,文件或协议消息中的固定大小字段时,特定位宽通常很重要。如果执行速度很重要,那么使用uint_fast8_t等。这可能是经常执行或在中断中执行的代码段。

所有这些类型为开发人员提供了一个额外的线索,让您了解您认为重要的内容以及您的意图。您可以更好地花费精力为开发人员提供清晰的代码,而不是试图通过对CPU的微优化来思考编译器。

答案 3 :(得分:0)

Serge Ballesta response above关于使用int_fast8_t / uint_fast8_t,如果可能的话,这是一个很好的建议。

这是一篇关于这个主题的好文章:

32‐Bit Microcontroller Code Size Analysis, Joseph Yiu, Andrew Frame:

  

概述

     

微控制器应用程序代码大小可以直接使用   因此影响产品的成本和功耗   几乎总是被视为选择a的重要因素   微控制器用于嵌入式项自发布以来   可用的32位处理器,如ARM Cortex-M3,更多和   更多的微控制器用户已经发现了切换的好处   32位产品 - 更低功耗,更高能效,更小   代码大小和更好的性能。虽然大多数的好处   使用32位微控制器是众所周知的代码大小   32位微控制器的优势不太明显。

     

在这篇文章中   我们将解释为什么32位微控制器可以减少应用程序   代码大小,同时仍然实现高系统性能和易用性   使用

本文中一个非常有趣的观点是16位" int"使用32位MCU。在某些情况下,Keith Thompson"为什么不使用int?"可以是很好的建议。

另外提供信息:

Efficient C Tips #1 – Choosing the correct integer size

  

......我终于在这些问题上挣扎多年了   意识到C99标准委员会已经解决了这个问题   我们。不少人现在知道C99标准标准化了   特定整数类型的命名约定(int8_t,uint8_t,   int16_t等)。不太为人所知的是他们也定义了数据   “最小宽度”和“最快宽度”的类型。

     

看看是否   你的编译器符合C99,打开stdint.h。如果符合要求,   除了uint8_t等数据类型,你还会看到至少两个   其他部分 - 最小宽度类型和最快最小宽度类型。

     

固定宽度无符号8位整数: uint8_t

     

最小宽度无符号8位整数: uint_least8_t

     

最快的最小宽度无符号8位整数: uint_fast8_t