需要一个无符号整数才能存储至少介于 0-65536 之间的值。int64_t (即便携式版本, from <stdint.h>
)将能够存储 -(2 63 -1) 和 2 63之间的值。这里有一个问题,即 unsigned int 的长度可能为 64 位,并且可能表示 int64_t 范围之外的值(参见 C 标准的 §5.2.4.2.1 p1 和下面的部分)。
这是标准所说的:
6.3.1.3 有符号和无符号整数
- 当整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则保持不变。
- 否则,如果新类型是无符号的,则在新类型可以表示的最大值的基础上重复加减一,直到该值在新类型的范围内。60)
- 否则,新类型是有符号的,值不能在其中表示;结果是实现定义的,或者引发了实现定义的信号。
60) 规则描述的是数学值的算术,而不是给定类型表达式的值。
忽略对应于计算异常的实现定义的信号是未定义的行为。
对于无符号到有符号的转换,我建议明确定义您的行为。饱和是最简单的:当您的 unsigned int 值大于 INT64_MAX 时,转换将导致 INT64_MAX。这看起来像x > INT64_MAX : INT64_MAX ? x
. unsigned int x = UINT_MAX; ++x == 0
由于 int64_t 保证不包含填充,因此可以为 int64_t包装 LIA 样式(例如),但需要做更多工作来保证可移植性。我建议类似(x & INT64_MIN) > INT64_MAX ? -(x & INT64_MAX) : x & INT64_MAX
,如果你能找到一些断言你的 int64 将具有与 C 标准 int64_t 相同的表示。