首先,我知道我想要做的事情可能超出了C标准。
我想知道是否可以在C中制作uint4_t
/ int4_t
或uint128_t
/ int128_t
类型。
我知道我可以使用位移和复杂功能来做到这一点,但是如果没有这些功能我可以做到吗?
答案 0 :(得分:3)
单个存储单元(字节)不小于CHAR_BITS
位宽 1 ;即使您使用单个4位位域创建struct
,关联的对象也将占用完整的存储单元。
有多个精度库(例如GMP)允许您处理不能容纳32或64位的值。可能想要检查出来。
<小时/>
答案 1 :(得分:2)
您可以使用结构中的位域来获取比uint8_t更窄的字段,但是,它们存储的基本数据类型将不会更小。
struct SmallInt
{
unsigned int a : 4;
};
将为您提供一个名为4位宽的成员的结构。
答案 2 :(得分:2)
实际上,如果你想要非常宽的数字(但是在标准C11中未指定)你可能想要使用一些arbitrary-precision算术外部库(又名bignums)。我建议使用GMPlib。
在某些情况下,对于微小的数字范围,您可以使用struct
内的位域来获得微小的整数。实际上,它们可能很昂贵(编译器会发出移位和位掩码指令来处理它们)。
另请参阅this answer在某些编译器中提及__int128_t
作为扩展名。