【发布时间】:2010-07-27 17:27:51
【问题描述】:
int 类型的变量据称是“一个机器类型的字长” 但是在嵌入式系统中,用于 8 位 micro 的 C 编译器使用 16 位的 int!,(对于 unsigned char 为 8 位)然后对于更多位,int 表现正常: 在 16 位 micros 中,int 也是 16 位,在 32 位 micros 中,int 是 32 位,等等。
那么,有没有一种标准的方法来测试它,比如 BITSIZEOF(int) ?
像“sizeof”是针对字节但针对位的。
这是我的第一个想法
register c=1;
int bitwidth=0;
do
{
bitwidth++;
}while(c<<=1);
printf("Register bit width is : %d",bitwidth);
但是它需要 c 作为 int,并且在 8 位编译器中使用 int 作为 16 位是很常见的,所以它给了我 16 作为结果,似乎没有使用“int”作为“寄存器宽度”的标准,(否则不尊重)
我为什么要检测它?假设我需要许多需要少于 256 个值的变量,因此它们可以是 8、16、32 位,但是使用正确的大小(与内存和寄存器相同)将加快速度并节省内存,如果这不能在代码中决定,我必须为每个架构重新编写函数
编辑 看完答案后发现这篇文章不错
http://embeddedgurus.com/stack-overflow/category/efficient-cc/page/4/
我将引用结论(加粗)
因此 底线是这个。如果你想 开始写作高效、便携 嵌入代码,第一步你 应该采取的是开始使用C99 数据类型“最少”和“快速”。如果你的 编译器不兼容 C99 抱怨直到它是 - 或改变 供应商。如果您进行此更改,我 觉得你会惊喜 在代码大小的改进和 您将达到的速度。
【问题讨论】:
-
使用 char、int、short 等类型是不好的做法,应该禁止用于嵌入式系统。我见过一个允许您更改每种类型的长度的编译器(CodeWarrior)。只需使用 types.h 头文件即可。
标签: c optimization embedded cpu-registers