我想在 C 函数内将 unsigned int 转换为 uint64。 uint64 在 R 包 int64 中定义。
编辑
本题是关于从 C unsigned int 数据类型到 uint64 R 语言数据类型的转换。
“int64 包已经开发出来,因此 64 位整数 vector 仅使用 R 数据结构表示,即数据不表示为某些 C++ 对象的外部指针。相反,每个 64 位整数表示为一对常规 32位整数,每个都携带底层 64 位整数的一半位。这是设计的选择,以便 64 位整数 vector 可以序列化并用作数据帧列。”
最佳答案
无符号整型必须能够存储至少 0-65536 范围内的值。 int64_t(这是可移植版本,来自 <stdint.h>
)将能够存储 -(263-1) 和 263 之间的值。这里有一个问题,即 unsigned int 的长度可能是 64 位,并且可能表示 int64_t 范围之外的值(请参阅 C 标准的第 §5.2.4.2.1 p1 节和下面的部分)。
标准的内容如下:
6.3.1.3 有符号和无符号整数
- 当一个整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则该值保持不变。
- 否则,如果新类型是无符号的,则通过在新类型可以表示的最大值之上重复加或减 1 来转换该值,直到该值在新类型的范围内。 60)
- 否则,新类型是有符号的,并且该值无法在其中表示;结果要么是实现定义的,要么引发实现定义的信号。
60) 这些规则描述的是数学值的算术,而不是给定类型表达式的值。
<小时/> 忽略与计算异常相对应的实现定义的信号是未定义的行为。对于无符号到有符号的转换,我建议明确定义您的行为。饱和是最简单的:当您的 unsigned int 值大于 INT64_MAX 时,转换将导致 INT64_MAX。这看起来像 x > INT64_MAX : INT64_MAX ? x
。对于 int64_t 来说,包装 LIA 样式(例如 unsigned int x = UINT_MAX; ++x == 0
)是可能的,因为保证 int64_t 不会包含填充,但需要做更多的工作来保证可移植性。我建议类似 (x & INT64_MIN) > INT64_MAX ? -(x & INT64_MAX) : x & INT64_MAX
,如果您可以找到一些断言,表明您的 int64 将具有与 C 标准 int64_t 相同的表示形式。
关于c - 如何将 unsigned int 转换为 uint64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14428845/