C中是否有通用的方法使数字大于64位或小于8位?

时间:2016-12-21 14:33:48

标签: c int

  

首先,我知道我想要做的事情可能超出了C标准。

我想知道是否可以在C中制作uint4_t / int4_tuint128_t / int128_t类型。

我知道我可以使用位移和复杂功能来做到这一点,但是如果没有这些功能我可以做到吗?

3 个答案:

答案 0 :(得分:3)

单个存储单元(字节)不小于CHAR_BITS位宽 1 ;即使您使用单个4位位域创建struct,关联的对象也将占用完整的存储单元。

有多个精度库(例如GMP)允许您处理不能容纳32或64位的值。可能想要检查出来。

<小时/>

  1. 最小8位,但可能更宽。

答案 1 :(得分:2)

您可以使用结构中的位域来获取比uint8_t更窄的字段,但是,它们存储的基本数据类型将不会更小。

struct SmallInt
{
   unsigned int a : 4;
};

将为您提供一个名为4位宽的成员的结构。

答案 2 :(得分:2)

实际上,如果你想要非常宽的数字(但是在标准C11中未指定)你可能想要使用一些arbitrary-precision算术外部库(又名bignums)。我建议使用GMPlib

在某些情况下,对于微小的数字范围,您可以使用struct内的位域来获得微小的整数。实际上,它们可能很昂贵(编译器会发出移位和位掩码指令来处理它们)。

另请参阅this answer在某些编译器中提及__int128_t作为扩展名。