【发布时间】:2016-12-21 16:25:14
【问题描述】:
下面的代码合法吗?
struct BigInt {
uint64_t a : 128;
};
【问题讨论】:
-
看起来像一个 XY 问题。你为什么认为你想要这个?
下面的代码合法吗?
struct BigInt {
uint64_t a : 128;
};
【问题讨论】:
位域必须适合单个 int,因此除非int 在您的平台上是 128 位,否则您将不走运。
(在编辑之前,您还在struct 末尾缺少;。)
【讨论】:
_Bool、int 和unsigned int 是有保证的。所以在一个 128 位 int 的实现上,会有一个 128 位的位域。一个实现可以提供更多类型。考虑到一些在较小架构上支持 128 位整数,可能还会有 128 位位域。
在标准 C11 中不合法(在大多数平台上;原则上,int 可能是 128 位,但我从未遇到过具有该功能的平台)。阅读n1570(规范草案)。
但在某些平台上,最近的编译器(例如GCC 6)提供了__int128 as an extension。您不会将其用作位域,而是用作某种整数类型。
另请参阅this 对相关问题的回答。
【讨论】:
int,因此可以有 128 位位域。 2) 该标准允许实现支持其他类型的位域。所以__int128 可以用作位域。结论:标准不允许! (实际的问题是它有什么用处)。