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

时间:2010-10-14 06:55:49

标签: c size integer c99

C99中的

stdint.h为整数大小,类型和范围提供了许多选项 - 很多我不知道选择哪些选项!

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

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

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

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

如果bits_per_pixel永远不会超过64,请使用charunsigned charuint8_tint或其他?

你会在这个例子中使用什么以及为什么?

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

我的问题简单来说就是:你如何选择使用哪个整数?

4 个答案:

答案 0 :(得分:4)

我会说:不要太担心这一点,它往往是一种过早优化的形式。但我的经验法则是:

  • 尽可能使用普通int。它应该是机器的自然字大小。
  • 当您需要明确定义的整数溢出时,请使用unsigned类型。
  • 当您需要二进制补码表示时,请使用(u)intX_t类型。
  • unsigned char用于值为<= UCHAR_MAX的大型数组。

请注意<stdint.h>中的很多类型都是可选的,因此您无法依赖它们的存在。 POSIX使这稍微好一些。

答案 1 :(得分:3)

对于您的示例,我只需对所有三个字段使用int或(可能更好)unsigned。除了包含数千或数百万个元素的数组之外,使用较小的类型是没有意义的;它只是强加了人为限制。

要回答更一般的问题,请遵循以下指南:

  • 始终为您要存储的值选择正确的签名。
  • 对于对象计数,索引,内存中字符串/数据的长度等,请使用size_t
  • 对于具有您需要存储的特定值范围的数据,以及您永远不需要存储超出范围的值的数据,请使用stdint.h中的一个固定大小的整数类型(uint8_tuint16_tuint32_t等)。想到这种需求的常见例子是像素值,音频样本和Unicode字符(通常分别为8位,16位和32位)。
  • 否则,intunsigned可能是正确使用的类型。

答案 2 :(得分:1)

没有严格的规则。

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

除非您针对特定任务遇到性能问题,否则我肯定会倾向于“太大”。虽然对比特/像素使用整数是有点傻,但在更大的方案中它可能不会伤害任何东西。

答案 3 :(得分:1)

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