如果我们在 PIC 微控制器中定义一个变量“整数”,当我在 Atmel 微控制器中定义相同的“int”变量时,它的大小是否相同?还是会有不同的尺寸?
这个问题在嵌入式系统面试中,答案应该是什么?
我有点迷茫!!
它取决于微控制器还是编程语言?在所有不同的编程语言中,相同的变量类型(如整数)的大小是否相同?
这不是同一个问题,因为它在嵌入式控制器中略有不同。
如果我们在 PIC 微控制器中定义一个变量“整数”,当我在 Atmel 微控制器中定义相同的“int”变量时,它的大小是否相同?还是会有不同的尺寸?
这个问题在嵌入式系统面试中,答案应该是什么?
我有点迷茫!!
它取决于微控制器还是编程语言?在所有不同的编程语言中,相同的变量类型(如整数)的大小是否相同?
这不是同一个问题,因为它在嵌入式控制器中略有不同。
面试问题的答案应该是这样的:
可能,在重要的地方应该使用 stdint.h 中定义的类型,或者以其他方式查阅编译器文档或检查 limits.h 中的定义。
面试官不太可能要求是/否的答案,并且在任何情况下都可能不会欣赏这种简洁的面试情况——这些问题旨在让你说话,直到你说了一些关于你自己或你的能力的有用或有趣的事情,并且知识。他可能正在寻找的是您是否知道 C 中的标准类型大小是编译器/体系结构依赖项这一事实,以及您如何处理可移植代码中的潜在可变性。
一个 PIC 和另一个 PIC 或一个 Atmel 和另一个之间的 int 很可能会有所不同,更不用说 PIC 和 Atmel 之间了。例如,Atmel AVR32 肯定不同于 8 位 AVR,同样基于 MIPS 的 PIC32 也不同于“经典”PIC。
此外,内置类型的大小严格来说是一个“编译器实现”问题,因此同一处理器的两个不同编译器可能会有所不同(尽管这极不可能 - 因为没有编译器供应商会明智地竭尽全力成为那个变态!)。
C 和 C++(当然还有汇编程序)以外的语言在小型微控制器上不太常见,因为这些是系统级语言,对运行时环境的要求最低,但类型的大小肯定会因语言定义而异。
问题是标准 C 类型往往会因实现而异。使用 stdint.h 中的类型将允许您指定所需的位数。
它取决于架构 32 位或 64 位。在 32 位系统上,您的整数将在 32bit 上编码:
对于有符号整数 32 位:
介于 -2,147,483,648 和 2,147,483,647 之间的值
在 64 位系统上,它将是 64 :
对于有符号整数 64 位:值介于 -9223372036854775808 和 9223372036854775807 之间
因此,要回答您的问题,整数可以有不同的大小,具体取决于您使用的架构。
提示:如果您的代码假设特定类型具有特定大小,则可以在编译期间验证此假设:
#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 将无法编译
这取决于很多事情,我不能说既不是也不是,但我的答案更多的是不是。
int
保证为16位。然而,在许多后来的体系结构int
中,它是 32 位数字,它不违反任何规则。据我所知,Atmels 8 位微控制器int
是 16 位的,不确定 PIC。
无论如何,我的建议是使用定义的类型。我不知道您使用的是什么编译器,但我使用的是 AVR Studio。它已定义类型,例如:
uint8_t
int8_t
uint16_t
...
int64_t
所以这些类型保证在每个处理器上都有相同的大小,你只需要通过你的编译器做一些研究。