【问题标题】:Is the Variable size in different Microcontroller will be the same? [duplicate]不同微控制器中的变量大小是否相同? [复制]
【发布时间】:2013-07-28 05:02:28
【问题描述】:

如果我们在 PIC 微控制器中定义一个变量“整数”,当我在 Atmel 微控制器中定义相同的“int”变量时,它的大小是否相同?或者它会是不同的大小?

这个问题在嵌入式系统面试中,答案应该是什么?

我有点迷茫!!

它取决于微控制器还是编程语言? 在所有不同的编程语言中,相同的变量类型(如整数)是否具有相同的大小??

这不是同一个问题,它在嵌入式控制器中略有不同。

【问题讨论】:

标签: c embedded microcontroller avr microchip


【解决方案1】:

面试问题的答案应该是这样的:

可能,在重要的地方应该使用 stdint.h 中定义的类型,或者查阅编译器文档或检查 limits.h 中的定义。

面试官不太可能要求是/否的答案,并且在任何情况下都可能不会欣赏这种简洁的面试情况 - 这些问题旨在让你说话,直到你说了一些有用或有趣的关于你自己或你的能力和知识。他可能正在寻找的是您是否知道 C 中的标准类型大小是编译器/架构依赖项这一事实,以及您如何处理可移植代码中的潜在可变性。

一个 PIC 和另一个 PIC 或一个 Atmel 和另一个之间的 int 很可能会有所不同,更不用说 PIC 和 Atmel 之间了。例如,Atmel AVR32 肯定不同于 8 位 AVR,同样基于 MIPS 的 PIC32 也不同于“经典”PIC。

此外,内置类型的大小严格来说是一个“编译器实现”问题,因此同一处理器的两个不同编译器可能会有所不同(尽管这极不可能 - 因为没有编译器供应商会明智地放弃他们的太变态了!)。

除 C 和 C++(当然还有汇编程序)以外的语言在小型微控制器上不太常见,因为这些是对运行时环境要求最低的系统级语言,但类型的大小肯定会因语言定义而异。

【讨论】:

    【解决方案2】:

    问题在于标准 C 类型往往会因实现而异。使用 stdint.h 中的类型将允许您指定所需的位数。

    【讨论】:

      【解决方案3】:

      这取决于 32 位或 64 位的架构。 在 32 位系统上,您的整数将被编码为 32 位:

      对于有符号整数 32 位:

      介于 -2,147,483,648 和 2,147,483,647 之间的值

      在 64 位系统上它将是 64:

      对于 64 位有符号整数:值介于 -9223372036854775808 和 9223372036854775807 之间

      因此,要回答您的问题,整数的大小可能会因您使用的架构而异。

      【讨论】:

      • 是的,但没那么简单。 8 位和 16 位处理器在嵌入式世界中仍然很常见。为方便起见,16 位处理器可能意味着 16 位 intint 可能是 32 位,即使处理器无法在单个操作中处理它 - 它最终是编译器和合同(如 ABI)的一个因素,而不是硬件。
      • 在 32 位和 64 位系统上甚至没有那么简单。在 64 位 Linux ABI 中,int 是 64 位,但在 Win64 中它仍然是 32 位。
      【解决方案4】:

      提示:如果您的代码假设特定类型具有特定大小,则可以在编译期间验证此假设:

      #define C_ASSERT(cond) char c_assert_var_##__LINE__[(cond) ? 1 : -1]
      C_ASSERT(sizeof(int) == 4);
      

      在编译期间,这将产生以下代码:

      char c_assert_var_350[(sizeof(int) == 4) ? 1 : -1];
      

      如果 sizeof(int) != 4 将无法编译

      【讨论】:

        【解决方案5】:

        这取决于很多事情,我不能说既不是也不是,但我的答案更多的是不是。

        int 保证为 16 位。然而,在许多后来的架构中,int 是 32 位数字,它不会违反任何规则。据我所知,Atmels 8 位微控制器int 是 16 位,但不确定 PIC。

        无论如何,我的建议是使用已定义的类型。我不知道您使用的是什么编译器,但我使用的是 AVR Studio。它定义了以下类型:

        uint8_t
        int8_t
        uint16_t
        ...
        int64_t
        

        所以这些类型保证在每个处理器上都具有相同的大小,您只需要通过编译器进行一些研究。

        【讨论】:

          猜你喜欢
          • 2011-12-11
          • 2014-05-28
          • 2019-07-03
          • 2019-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-14
          • 2022-11-23
          相关资源
          最近更新 更多