如果编写程序,并且我需要一个低于255的数字,是否可以使用 unsigned char
类型作为数字,例如,如果我需要一个数字来进行循环?是否有任何理由,包括坚持传统和惯例,坚持使用int和float等声明数字 .
例如,如果这样的代码永远不会被使用?或者在这种情况下使用unsigned char是一个好习惯,因为它分配的内存少于short int?
#include <stdio.h>
typedef unsigned char short_loop;
int main(int argc, char *argv[])
{
short_loop i;
for(i = 0; i < 138; i++)
printf("StackOverflow Example Code\n");
return 0;
}
我要求将来参考,并且只使用上面的代码来帮助说明 .
3 回答
我不会这样做 .
如果您的程序使用大型值数组,则使用
char
数组而不是int
数组的内存使用方面有一个好处 .但是,对于单个循环的控制变量,由于几个原因,不太可能有很多好处,并且可能会导致性能损失 .
比较
i < 138
会在进行比较之前将i
提升为int
,因为138
的类型为int
. 促销(和下转换)也可能在初始化和递增i
时发生 .int
通常是主机上的"native type" - 这通常意味着它是主机上首选的类型(例如,硬件提供针对该类型操作时针对性能进行了优化的寄存器) . 其中,即使在循环中进行比较之前使用某种技术来阻止unsigned char
升级到int
,int
上的操作无论如何都可能更有效 .因此,最终,您的方法可能会或可能不会带来性能优势 . 确保唯一的方法是对代码进行分析......并且(或其他方面)的好处将取决于编译器(例如受优化方法影响)和主机相关(例如,与操作相比,
unsigned char
上的操作效率如何int
)您的方法也使代码更难理解,因此更难以正确 . 而且,如果其他程序员(或您)将来修改代码,则可能会取消任何好处....例如,意外重新引入非预期的类型转换 .
是的,使用
unsigned char
很好 . 我不会使用short_loop
typedef,它只是无缘无故地混淆代码 .有些人会建议使用
uint8_t
强调intent是一个小整数,而不是字符数据;即使uint8_t
很可能是unsigned char
的typedef .从理论上讲,你可以使用typedef
uint_fast8_t
,这应该是"an unsigned integer type, at least 8 bits, and the fastest possible of the available types",显然"fastest"的解释有点模糊 .用于PC - 不是很好的做法 . 用于嵌入式设备 - 取决于 .
如果保证它不会超过255,那么确保你可以使用它,因为它无论如何都转换为int,但在这个例子中,内存差异不是很大 .
它违反了可读性 .
正如其他人所说,你不必要地混淆你的代码 . 使用类型定义..也给它丑陋的名字 . 已知索引的类型为int . 就这样 .