【问题标题】:Can 32-bit (void *) generic (32-bit OS) be used for storing uint64_t data?可以使用 32 位 (void *) 通用(32 位操作系统)来存储 uint64_t 数据吗?
【发布时间】:2020-02-04 03:07:14
【问题描述】:

在 C 中使用 void 指针是通用数据类型的一种可移植方法(假设我不想使用预处理器宏或联合类型)?出现这个问题的原因是因为假设我想将 uint64_t 数据存储在 32 位 Linux 发行版中的 void 指针中(=> sizeof(void *) = 4 bytes),将 uint64_t 类型转换为 (void *) 是否安全用于传递给函数,然后将其类型转换回 uint64_t 以检索数据?

【问题讨论】:

标签: c linux


【解决方案1】:

uint64_t 数据“存储在”void * 中,或将任何其他类型的数据“存储在指向 void 的指针中”的常用方法是将该指针指向 指向uint64_t 类型的对象(或任何其他所需类型),并让该对象保存该值。

这对某些人来说似乎显而易见,但它至少每周都会出现在 Stack Overflow 上,尤其是 pthread_createpthread_join - 使用那些 API,您应该拥有指向 指向回调中可能需要的所需数据。

【讨论】:

    【解决方案2】:

    void* 用于存储address,该address 包含任何大小的类型。它不适用于存储不代表内存地址的整数值。

    如果您想在没有指针的情况下将多个不同大小的类型存储在一个类型中,请考虑使用枚举复合类型。这种类型将使用两个 32 位整数在 32 位系统上工作。

    enum 32_or_64_int_t {
          UINT32_TYPE,
          UINT64_TYPE
    };
    
    struct 64_int_t {
        uint32_t value[2];
        enum 32_or_64_int_t type;
    };
    

    如果您想要做的不仅仅是存储它,您仍然需要使用这种方法实现 64 位算术和其他操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-31
      • 2018-03-03
      • 2013-08-29
      • 2012-05-09
      • 2016-02-07
      • 1970-01-01
      • 2015-09-26
      • 2012-09-01
      相关资源
      最近更新 更多