代码之家  ›  专栏  ›  技术社区  ›  x-x

为变量选择最合适的整数大小/范围

  •  6
  • x-x  · 技术社区  · 16 年前

    stdint.h 在C99中,为整数大小、类型和范围提供了许多选项——很多我不知道要选择什么!

    我知道 how to use size_t and ptrdiff_t 在适当的时候,我使用固定大小的类型进行存储和传输。我的问题是只存储在主机内存中的值。

    例如,图像的结构可能包含以下成员:

    struct image {
        integer width, height; /* pixel dimensions of the image */
        integer bits_per_pixel;
        ...
    };
    

    如果 width 和 height 永远不会超过 SHRT_MAX 应该是 short 使用或坚持 int ?图像不能有负的宽度或高度,所以使用无符号类型?也许 (u)int_least16_t 选择正确吗?还有别的吗?

    如果 bits_per_pixel 不会超过64次使用的值 char , unsigned char , uint8_t , int 或者别的什么?

    在这个例子中,您将使用什么?为什么?

    运行代码的CPU体系结构如何影响选择?即PPC或x86,32或64位。
    运行代码的设备如何影响选择?即桌面、电话、控制台。
    选择如何与性能和优化相关?

    简单来说,我的问题是:如何选择要使用的整数?

    4 回复  |  直到 14 年前
        1
  •  4
  •   schot    16 年前

    我会说:别担心这件事,这通常是一种过早的优化。但我的经验法则是:

    • 使用平原 int 如果可能的话。它应该是机器的自然字大小。
    • 使用 unsigned 当需要定义良好的整数溢出时键入。
    • 使用一个 (u)intX_t 需要两个补码表示时键入。
    • 使用 unsigned char 对于具有值的大型数组 <= UCHAR_MAX .

    注意,很多类型的 <stdint.h>

        2
  •  3
  •   R.. GitHub STOP HELPING ICE    16 年前

    对于您的示例,我将简单地使用 int 或者(也许更好) unsigned 三个领域。除了包含数千或数百万个元素的数组之外,使用较小的类型是没有意义的;它只是强加了人为的限制。

    为了回答更一般的问题,下面是一些指导原则:

    • 始终为要存储的值选择正确的签名。
    • 对于对象计数、索引、内存中字符串/数据的长度等,请使用 size_t .
    • 对于具有您需要存储的特定值范围的数据,以及不需要在该范围之外存储值的数据,请使用 stdint.h ( uint8_t , uint16_t , uint32_t 等)。这种需求的常见例子是像素值、音频样本和Unicode字符(通常分别为8、16和32位)。
    • 否则, int 或 未签名的 可能是正确的类型。
        3
  •  1
  •   nsanders    16 年前

    没有硬性规定。

    如果您选择的类型太小,那么最终可能会人为地限制程序可以处理的数据集。太大了,你的表现可能会受到影响。

    除非你正在为你的特定任务遇到性能问题,否则我肯定会倾向于“太大”。虽然使用整数作为比特/像素有点愚蠢,但它可能不会伤害到更大范围的事物。

        4
  •  1
  •   patentfox    16 年前

    除非您的应用程序确实是内存密集型的,否则不要担心大小和使用int。使用short或char可能会导致细微的错误,这可能会在以后引起问题。另外,使用char或short不会获得任何额外的CPU周期。