【问题标题】:how to create a new type with custom bytes in C?如何在 C 中创建具有自定义字节的新类型?
【发布时间】:2018-09-06 13:38:13
【问题描述】:

是否可以在 C 中创建一个使用我决定的字节数的新类型? 我知道一个 int 需要 4 个字节,但我需要处理非常小的数字,所以为每个 int 分配 4 个字节和 malloc 有点浪费,我正在考虑为只需要 1 个字节的数字创建一种新类型。 ..如果可能的话

【问题讨论】:

  • 仅占用 1 个字节的数字的新类型 - 在 C 中称为 char
  • 您说的是int8_tuint8_t,它们是inttypes.h 的一部分吗?
  • “我知道一个 int 需要 4 个字节”....它是最快的通用数据类型,在当今的 CPU 上通常是 32 位,但这还远未确定。
  • 但我需要处理非常小的数字,所以为每个 int 分配 4 个字节的 malloc 有点浪费 你为什么认为你需要使用 malloc整数值?为此,您需要数据和指向该数据的指针,并且您需要传递指针的值来访问数据。直接传值就好了。

标签: c byte


【解决方案1】:

是否可以在 C 中创建一个使用我决定的字节数的新类型?

是的,您可以声明一个由char(或signed charunsigned char)组成的数组,其长度为您喜欢的任何正数,最高可达依赖于实现(但通常很大)的限制。

我知道一个 int 需要 4 个字节,

你错了:int可能占用四个字节,但标准没有要求。它的最小要求范围只能用两个字节表示,并且某些实现确实提供了两个字节ints。这在历史上比今天更普遍。此外,实现可以使int 大于 超过四个字节。这在默认情况下很少见,但一些编译器提供了生成该结果的选项。

但是我需要处理非常小的数字,所以为每个 int 分配 4 个字节的 malloc 有点浪费,我正在考虑为只需要 1 个字节的数字创建一种新类型......如果可能的话。

单字节数字是signed charunsigned char。从技术上讲,普通的char 也符合条件,但它的符号是实现定义的,并且作为一种风格,最好将其用于字符数据。此外,从技术上讲,char 及其有符号和无符号变体可能大于 8 位,但在这种情况下您不太可能遇到 C 实现,而且 C 无论如何也不提供更小的数据类型。

【讨论】:

    【解决方案2】:

    您可以只使用char 而不是int

    或者,你可以创建structure,它是C语言中最常用的自定义数据类型。 例如:

    struct customStructure {
        char c;
    };
    

    【讨论】:

      【解决方案3】:

      一个字节类型已经存在,它被称为charsizeof(char)=1,所以严格来说数据类型,char是你可以通过C管理的最小内存量。

      但是,如果您谈论的是位,这并不意味着char 类型始终是 8 位(在 DSP 中通常是 10 或 16 位的字节)。鉴于此,char 中的位数由CHAR_BIT 表示。

      【讨论】:

        【解决方案4】:

        严格来说,根据 C 标准,int 至少有 2 个字节,并且类型的实际宽度取决于机器。如果你想要一定宽度的数字类型,我建议你看一下<stdint.h>中定义的那些。

        如果您真的想要使用具有 N 字节的类型,您可以使用 char small_numbers[N] 并通过一些小玩意弄脏您的手,但更实际的解决方案是简单地使用内置类型。

        【讨论】:

          【解决方案5】:

          您可以分别对字节和位使用以下结构。

           typedef struct data_type_bytes {
                  unsigned char data;
           } bytes;
          
          typedef struct data_type_bits{
             unsigned int heightValidated : 1;
          } bits;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-10-09
            • 2013-10-14
            • 2015-01-11
            • 2018-02-18
            • 1970-01-01
            • 1970-01-01
            • 2012-05-17
            相关资源
            最近更新 更多