当只需要少量字符时,使用类型unsigned char是否可以接受?

当只需要少量字符时,使用类型unsigned char是否可以接受?,c,variables,memory-management,integer,C,Variables,Memory Management,Integer,如果正在编写一个程序,并且我需要一个小于255的数字,那么可以使用typeunsigned char作为一个数字,比如我需要一个数字来进行循环吗?是否有任何理由,包括坚持传统和惯例,坚持用int和float等来声明数字 例如,像这样的代码永远不应该被使用吗?或者在这种情况下使用无符号字符是一种很好的做法,因为它分配的内存比短int少 #include <stdio.h> typedef unsigned char short_loop; int main(int argc, ch

如果正在编写一个程序,并且我需要一个小于255的数字,那么可以使用type
unsigned char
作为一个数字,比如我需要一个数字来进行循环吗?是否有任何理由,包括坚持传统和惯例,坚持用int和float等来声明数字

例如,像这样的代码永远不应该被使用吗?或者在这种情况下使用无符号字符是一种很好的做法,因为它分配的内存比短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;
}
#包括
typedef无符号字符短_循环;
int main(int argc,char*argv[])
{
短环i;
对于(i=0;i<138;i++)
printf(“StackOverflow示例代码\n”);
返回0;
}

我要求将来参考,并且仅使用上面的代码来帮助说明。

用于PC-不是很好的实践。 用于嵌入式设备-取决于

如果保证它不会超过255,那么请确保在它被转换为int时仍然可以使用它,但是在本例中,内存差异不是很明显

它违反了可读性


正如其他人所说,您正在不必要地混淆代码。 使用类型定义。。也给它起了一个丑陋的名字。
索引是已知的int类型。仅此而已。

用于PC-不是很好的做法。 用于嵌入式设备-取决于

如果保证它不会超过255,那么请确保在它被转换为int时仍然可以使用它,但是在本例中,内存差异不是很明显

它违反了可读性


正如其他人所说,您正在不必要地混淆代码。 使用类型定义。。也给它起了一个丑陋的名字。 索引是已知的int类型。仅此而已。

我不会这么做

如果您的程序使用的是大型值数组,那么使用
char
数组而不是
int
数组在内存使用方面会有好处

但是,对于单个循环的控制变量,由于几个原因,不太可能有多大好处,并且可能会影响性能

比较
i<138
将在进行比较之前将
i
提升到
int
,因为
138
属于
int
类型。升级(和向下转换)也可能在初始化和递增
i
时发生

int
通常是主机上的“本机类型”-这通常意味着它是主机上首选的类型(例如,硬件提供了在该类型上操作时性能优化的寄存器)。即使在循环中进行比较之前使用了某种技术来防止将
无符号字符提升为
int
,对
int
的操作也可能更有效

因此,最终,您的方法可能会也可能不会带来性能优势。唯一确定的方法是分析代码。。。。好处(或其他方面)取决于编译器(例如受优化方法的影响)和主机(例如与
int
上的操作相比,
无符号字符的操作效率如何)

您的方法还使代码更难理解,因此更难正确理解。而且,如果将来有其他程序员(或您)修改代码,任何好处都可能被否定。。。。例如,通过意外地重新引入非预期的类型转换。

我不会这样做

如果您的程序使用的是大型值数组,那么使用
char
数组而不是
int
数组在内存使用方面会有好处

但是,对于单个循环的控制变量,由于几个原因,不太可能有多大好处,并且可能会影响性能

比较
i<138
将在进行比较之前将
i
提升到
int
,因为
138
属于
int
类型。升级(和向下转换)也可能在初始化和递增
i
时发生

int
通常是主机上的“本机类型”-这通常意味着它是主机上首选的类型(例如,硬件提供了在该类型上操作时性能优化的寄存器)。即使在循环中进行比较之前使用了某种技术来防止将
无符号字符提升为
int
,对
int
的操作也可能更有效

因此,最终,您的方法可能会也可能不会带来性能优势。唯一确定的方法是分析代码。。。。好处(或其他方面)取决于编译器(例如受优化方法的影响)和主机(例如与
int
上的操作相比,
无符号字符的操作效率如何)


您的方法还使代码更难理解,因此更难正确理解。而且,如果将来有其他程序员(或您)修改代码,任何好处都可能被否定。。。。例如,通过意外地重新引入非预期的类型转换。

是,使用
无符号字符
是可以的。我不会使用
short_循环
typedef,它只是无缘无故地混淆了代码

有些人建议使用
uint8\u t
来强调意图是一个小整数,而不是字符数据;即使
uint8\u t
很可能是
无符号字符的typedef


理论上,您可以使用typedef
uint\u fast8\u t
,这意味着“一个无符号整数类型,至少8位,以及可用类型中可能最快的类型”,显然“最快”的解释有点模糊。

是的,使用
无符号字符