使用 <stdint.h> 以外的自定义 int 大小

Custom int size other than using <stdint.h>

如何获得自定义大小的整数数据类型?除了使用像 uint16_tuint32_t 这样的 <stdint.h> 类型,还有其他答案吗?这些类型是否与平台无关?

答案是大部分不。<stdint.h>提供给定平台上可用的特定大小的整数,但没有标准的获取方式,例如,一个 20 位整数 ,但您可以使用位域指定比 <stdint.h> 提供的大小 更小 的任意大小。下面提供了一个 20 位 unsigned int,尽管界面有点笨拙,但它的工作方式与您预期的一样。

struct uint20_s {
   unsigned int val : 20;
};

从广义上讲,为大于底层硬件支持的字长实现整数语义并非易事。有 an entire class of libraries 专门用于处理任意精度数字。

您可以使用位字段将自定义宽度的整数作为结构中的成员,如:

struct foo { int x : 13; } f;

位域支持的最大宽度取决于实现和用于它的基本类型(int 以上)。

uint16_tuint32_t 等标准类型的宽度当然不依赖于实现,但它们是否由实现提供是。

聚会有点晚了,但是...有一个很好的解决方案! Clang 具有此新功能(发布于 4/24/2020),它允许您声明自定义大小的整数。您必须使用 _ExtInt 关键字。一个例子:

_ExtInt(13) foo;

查看 了解更多详情。