有没有一种标准的方法来检测硬件的位宽?

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个值的类型,并且很快.

然后,无论平台如何,类型都会相应更改,并且您不会更改代码中的任何内容.如果您的平台没有这些定义的集合,您可以添加自己的平台.

远比改写每个功能好得多.

  • 一旦我开始使用`stdint.h`,我就再也没有回头了.这样可以简化便携性. (2认同)

Pau*_*l R 7

#include <limits.h>

const int bitwidth = sizeof(int) * CHAR_BIT;
Run Code Online (Sandbox Code Playgroud)


Ama*_*9MF 7

为了更直接回答你的更深层次的问题,如果你有需要一种可以跨平台移植非常具体的存储大小,你应该使用类似定义有位数指定的存储类型.types.h stdint.h

例如,uint32_t始终是无符号32位,int8_t始终为8位.