首页 文章

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

提问于
浏览
0

如果编写程序,并且我需要一个低于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 回答

  • 2

    我不会这样做 .

    如果您的程序使用大型值数组,则使用 char 数组而不是 int 数组的内存使用方面有一个好处 .

    但是,对于单个循环的控制变量,由于几个原因,不太可能有很多好处,并且可能会导致性能损失 .

    比较 i < 138 会在进行比较之前将 i 提升为 int ,因为 138 的类型为 int . 促销(和下转换)也可能在初始化和递增 i 时发生 .

    int 通常是主机上的"native type" - 这通常意味着它是主机上首选的类型(例如,硬件提供针对该类型操作时针对性能进行了优化的寄存器) . 其中,即使在循环中进行比较之前使用某种技术来阻止 unsigned char 升级到 intint 上的操作无论如何都可能更有效 .

    因此,最终,您的方法可能会或可能不会带来性能优势 . 确保唯一的方法是对代码进行分析......并且(或其他方面)的好处将取决于编译器(例如受优化方法影响)和主机相关(例如,与操作相比, unsigned char 上的操作效率如何 int

    您的方法也使代码更难理解,因此更难以正确 . 而且,如果其他程序员(或您)将来修改代码,则可能会取消任何好处....例如,意外重新引入非预期的类型转换 .

  • 1

    是的,使用 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"的解释有点模糊 .

  • 2

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

    如果保证它不会超过255,那么确保你可以使用它,因为它无论如何都转换为int,但在这个例子中,内存差异不是很大 .

    它违反了可读性 .


    正如其他人所说,你不必要地混淆你的代码 . 使用类型定义..也给它丑陋的名字 . 已知索引的类型为int . 就这样 .

相关问题