【问题标题】:Is there a general way in C to make a number greater than 64 bits or smaller than 8 bits?C 中是否有一种通用方法可以使数字大于 64 位或小于 8 位?
【发布时间】:2016-12-21 14:33:47
【问题描述】:

首先,我知道我正在尝试做的事情可能超出了 C 标准。

我想知道是否可以在 C 中输入 uint4_t/int4_tuint128_t/int128_t

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

【问题讨论】:

  • 不,你不能……
  • 困难的部分是为这些类型重新定义算术运算符。
  • 你的背包里有积木吗?不?为什么不?因为你只是没有它!
  • 我认为“复杂”是指复杂,而不是采用 std::complex<double> 或类似的函数?
  • @Hurkyl,在 C 中没有 std::complex<double>

标签: c int


【解决方案1】:

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

有多个精度库(例如 GMP)允许您处理无法放入 32 位或 64 位的值。可能想检查一下。


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

【讨论】:

  • GMP可以做4位吗?
  • @MarkYisri:它当然可以表示最多 4 位宽的 ,但本机整数类型也可以。同样,object 的宽度不能小于 8 位。 MP 库更适合处理无法适合本机类型的值。
【解决方案2】:

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

struct SmallInt
{
   unsigned int a : 4;
};

将为您提供一个结构,其中包含一个名为 a 的 4 位宽的成员。

【讨论】:

  • 这不是标准 C。您不能将uint8_t 用于位域。
  • 这是一个标准参考:C11 6.7.2.1 5 "位域的类型应该是_Boolsigned intunsigned int的合格或不合格版本, 或其他一些实现定义的类型。是否允许原子类型是实现定义的。" 在 C++ 中取消了此限制:C++14 9.6 3 "... 位字段应具有整数或枚举类型...".
  • @Lundin 谢谢,两位,已更新。
  • @Colin__s 如果我打包这个结构,会占用 4 位吗?
  • @MarkYisri,不,它至少会占用sizeof(unsigned int)sizeof(char) 根据标准为 1,char 位根据标准至少为 8。
【解决方案3】:

实际上,如果您想要非常宽的数字(但在标准 C11 中未指定),您可能希望使用一些 arbitrary-precision 算术 external 库(又名大数)。我推荐使用GMPlib

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

另请参阅 this answer 提到 __int128_t 作为某些编译器中的扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 2015-08-09
    相关资源
    最近更新 更多