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