2010-10-14 64 views
6

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; 
    ... 
}; 

如果widthheight绝不会超过SHRT_MAX,应在short使用,或与int坚守?图像不能有负宽度或高度,所以使用无符号类型?也许(u)int_least16_t是正确的选择?还有别的吗?

如果bits_per_pixel绝不会超过64个使用charunsigned charuint8_tint或别的东西的价值?

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

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

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

回答

4

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

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

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

1

没有硬性规定。

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

除非您遇到针对您的特定任务的性能问题,否则我肯定会倾向于“太大”。虽然使用一个整数来表示比特/像素是愚蠢的,但它可能不会损害任何更大的方案。

1

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

3

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

要回答的更普遍的问题,下面是一些指导我去了:

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

+1为固定大小的数据示例。 – schot 2010-10-14 07:27:35

相关问题