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

C 为变量选择最合适的整数大小/范围,c,size,integer,c99,C,Size,Integer,C99,在C99中,提供了许多整数大小、类型和范围的选项——太多了,我不知道该选择什么 我知道什么时候合适,我使用固定大小的类型进行存储和传输。我的问题涉及仅存储在主机内存中的值 例如,图像的结构可能包含以下成员: struct image { integer width, height; /* pixel dimensions of the image */ integer bits_per_pixel; ... }; 如果宽度和高度永远不会超过SHRT_MAX,应该使用短,

在C99中,提供了许多整数大小、类型和范围的选项——太多了,我不知道该选择什么

我知道什么时候合适,我使用固定大小的类型进行存储和传输。我的问题涉及仅存储在主机内存中的值

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

struct image {
    integer width, height; /* pixel dimensions of the image */
    integer bits_per_pixel;
    ...
};
如果
宽度
高度
永远不会超过
SHRT_MAX
,应该使用
,还是坚持使用
int
?图像不能具有负宽度或负高度,因此是否使用无符号类型?也许
(u)int\u至少16\u t
是正确的选择?还有别的吗

如果每像素
永远不会超过64,请使用
char
无符号char
uint8\u t
int
或其他方法

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

运行代码的CPU架构如何影响选择?i、 e.PPC或x86、32或64位。
运行代码的设备如何影响选择?i、 e.桌面、电话、控制台。
选择与性能和优化有何关系


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

我想说:不用太担心,这通常是一种过早优化的形式。但我的经验法则是:

  • 尽可能使用普通
    int
    。它应该是机器的自然字号
  • 当需要定义良好的整数溢出时,请使用
    无符号
    类型
  • 当需要两个补码表示时,请使用
    (u)intX\t
    类型

  • 使用
    无符号字符
    对于具有值的大型数组
    没有硬性规则

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


    除非您在执行特定任务时遇到性能问题,否则我肯定会倾向于“太大”。虽然使用整数表示位/像素有点傻,但在更大的范围内,它可能不会损害任何东西

    除非您的应用程序是真正的内存密集型应用程序,否则不要担心大小和使用int。使用short或char可能会导致细微的错误,这可能会在以后导致问题。此外,使用char或short不会增加任何CPU周期。

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

    为了回答更一般的问题,以下是我遵循的一些准则:

    • 始终为要存储的值选择正确的符号
    • 对于对象计数、索引、内存中字符串/数据的长度等,请使用
      size\t
    • 对于具有需要能够存储的特定值范围的数据,如果不需要存储超出范围的值,请使用
      stdint.h
      uint8\u t
      uint16\u t
      uint32\u t
      等)中的固定大小整数类型之一。这种需求的常见例子是像素值、音频样本和Unicode字符(通常分别为8、16和32位)
    • 否则,
      int
      unsigned
      可能是正确的类型