使用 <stdint.h> 以外的自定义 int 大小
Custom int size other than using <stdint.h>
如何获得自定义大小的整数数据类型?除了使用像 uint16_t
和 uint32_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_t
和 uint32_t
等标准类型的宽度当然不依赖于实现,但它们是否由实现提供是。
聚会有点晚了,但是...有一个很好的解决方案! Clang 具有此新功能(发布于 4/24/2020),它允许您声明自定义大小的整数。您必须使用 _ExtInt
关键字。一个例子:
_ExtInt(13) foo;
查看 了解更多详情。
如何获得自定义大小的整数数据类型?除了使用像 uint16_t
和 uint32_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_t
和 uint32_t
等标准类型的宽度当然不依赖于实现,但它们是否由实现提供是。
聚会有点晚了,但是...有一个很好的解决方案! Clang 具有此新功能(发布于 4/24/2020),它允许您声明自定义大小的整数。您必须使用 _ExtInt
关键字。一个例子:
_ExtInt(13) foo;
查看