代码之家  ›  专栏  ›  技术社区  ›  Hernán Eche Shankar ARUL

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

  •  5
  • Hernán Eche Shankar ARUL  · 技术社区  · 14 年前

    int类型的变量据称是“一个机器类型的单词长度” 但在嵌入式系统中,用于8位微操作的C编译器的int值为16位!,(无符号字符为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,那么 抱怨直到“或改变” 供应商。 如果你做这个改变,我 以为你会惊喜不已 在代码大小和 您将达到的速度。

    7 回复  |  直到 14 年前
        1
  •  17
  •   GManNickG    14 年前

    我必须为每个体系结构重新编写函数

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

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

    比重写每个函数要好得多。

        2
  •  7
  •   Amardeep AC9MF    14 年前

    为了更直接地回答您的更深层次的问题,如果您需要跨平台可移植的非常特定的存储大小,您应该使用 types.h stdint.h 它定义了用位数指定的存储类型。

    例如, uint32_t 总是无符号32位和 int8_t 总是有符号的8位。

        3
  •  7
  •   Paul R    14 年前
    #include <limits.h>
    
    const int bitwidth = sizeof(int) * CHAR_BIT;
    
        4
  •  1
  •   Luke404    14 年前

    这个 ISA 编译时编译器已经知道您正在编译的代码,所以您最好在编译时检测它。根据您的环境,您可以使用从autoconf/automake风格的东西到较低级别的ifdef来将代码调到运行它的特定体系结构。

        5
  •  1
  •   AnT stands with Russia    14 年前

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

    至于位宽… sizeof(int) * CHAR_BIT 将给出类型的对象表示中的位数 int .

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

    另外,看你问题的题目,我怀疑你真正需要的只是 CHAR_BIT 价值。

        6
  •  0
  •   MikeyB    14 年前

    做一个 unsigned char unsigned short 适合你的需求?为什么不用那个?如果没有,您应该使用编译时标志来引入适当的代码。

        7
  •  0
  •   kmalmur    14 年前

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