Her*_*che 5 c embedded optimization cpu-registers
int类型的变量据称是"一个机器类型的字长",但在嵌入式系统中,8位微处理器的C编译器使用16位的int!(对于无符号字符为8位)然后对于更多位,int表现正常:在16位微型int中也是16位,在32位微型int中是32位等.
那么,有没有一种标准的方法来测试它,比如BITSIZEOF(int)?
比如"sizeof"就是字节而是比特.
这是我的第一个想法
register c=1;
int bitwidth=0;
do
{
bitwidth++;
}while(c<<=1);
printf("Register bit width is : %d",bitwidth);
Run Code Online (Sandbox Code Playgroud)
但是它需要c作为int,并且在8位编译器中通常使用int作为16位,因此它给出了16作为结果,似乎没有使用"int"作为"寄存器宽度"的标准,(或者它不是尊敬的)
为什么我要检测它?假设我需要许多需要少于256个值的变量,因此它们可以是8,16,32位,但是使用正确的大小(与内存和寄存器相同)将加速并节省内存,如果这不是在代码中决定,我必须为每个架构重新编写函数
编辑 阅读完答案后,我找到了这篇好文章
http://embeddedgurus.com/stack-overflow/category/efficient-cc/page/4/
我将引用结论(加粗)
因此,底线是这样的.如果您想开始编写高效,可移植的嵌入式代码,您应该采取的第一步是开始使用C99数据类型"最少"和"快速".如果你的编译器不符合C99,那就 一直抱怨 - 或者改变供应商.如果您进行此更改,我认为您会对代码大小和速度的改进感到惊喜.
GMa*_*ckG 17
我必须为每个架构重新编写函数
不,你没有.使用stdint.h类似的类型的C99 ,uint_fast8_t它将是一种能够容纳256个值的类型,并且很快.
然后,无论平台如何,类型都会相应更改,并且您不会更改代码中的任何内容.如果您的平台没有这些定义的集合,您可以添加自己的平台.
远比改写每个功能好得多.
#include <limits.h>
const int bitwidth = sizeof(int) * CHAR_BIT;
Run Code Online (Sandbox Code Playgroud)
为了更直接回答你的更深层次的问题,如果你有需要一种可以跨平台移植非常具体的存储大小,你应该使用类似定义有位数指定的存储类型.types.hstdint.h
例如,uint32_t始终是无符号32位,int8_t始终为8位.