C 为变量选择最合适的整数大小/范围
在C99中,提供了许多整数大小、类型和范围的选项——太多了,我不知道该选择什么 我知道什么时候合适,我使用固定大小的类型进行存储和传输。我的问题涉及仅存储在主机内存中的值 例如,图像的结构可能包含以下成员: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,应该使用短,
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
可能是正确的类型