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

时间:2010-07-27 17:27:51

标签: c optimization embedded 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);

但它需要c作为int,并且在8位编译器中使用int作为16位是常见的,因此它给出了16作为结果,似乎没有标准使用“int”作为“寄存器宽度”,(或者它没有得到尊重)

为什么我要检测它?假设我需要许多需要少于256个值的变量,因此它们可以是8,16,32位,但使用正确的大小(与内存和寄存器相同)将加速并节省内存,如果这不是在代码中决定,我必须为每个架构重新编写函数

修改 看完答案后,我找到了这篇好文章

http://embeddedgurus.com/stack-overflow/category/efficient-cc/page/4/

我将引用结论(加粗)

  

因此   底线是这个。如果你想   开始写高效,便携   嵌入式代码,第一步你   应该采取的是开始使用C99   数据类型'最少'和'快'。如果你的   编译器不符合C99   抱怨直到 - 或改变   供应商。如果你做了这个改变我   认为你会惊喜   在代码大小的改进和   你将达到的速度。

7 个答案:

答案 0 :(得分:17)

  

我必须为每个架构重新编写函数

不,不。使用C99的stdint.h,其类型为uint_fast8_t,这将是一种能够快速保存256个值的类型。

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

远比重写每个功能好。

答案 1 :(得分:7)

#include <limits.h>

const int bitwidth = sizeof(int) * CHAR_BIT;

答案 2 :(得分:7)

要更直接地回答您的更深层次的问题,如果您需要跨平台可移植的非常具体的存储空间,则应使用 types.h stdint.h之类的内容。定义用位数指定的存储类型。

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

答案 3 :(得分:1)

编译时编译的ISA在代码运行时已经为编译器所知,所以最好的办法是在编译时检测它。根据您的环境,您可以使用从autoconf / automake样式内容到较低级别#ifdef的所有内容来将代码调整为它将运行的特定体系结构。

答案 4 :(得分:1)

我并不完全理解你的意思是“没有标准使用”int“as”寄存器宽度“。在原始的C语言规范(C89 / 90)中,类型int隐含在当没有提供显式类型时,某些上下文。register c等同于register int c,这在C89 / 90中是完全标准的。另请注意,C语言规范要求类型int至少支持-32767 ... + 32767范围,意味着在任何平台int上将至少有16个值形成位。

对于位宽... sizeof(int) * CHAR_BIT将为您提供类型为int的对象表示中的位数。

但从理论上讲,类型int的值表示不能保证使用其对象表示的所有位。如果您需要确定用于值表示的位数,则可以简单地分析INT_MININT_MAX值。

P.S。看看你问题的标题,我怀疑你真正需要的只是CHAR_BIT值。

答案 5 :(得分:0)

unsigned charunsigned short是否符合您的需求?为什么不使用它?如果没有,您应该使用编译时标志来引入适当的代码。

答案 6 :(得分:0)

我认为在这种情况下,您不需要知道您的架构有多少位。如果要优化代码,只需使用尽可能小的变量即可。