0

我想在 C 函数中将 unsigned int 转换为 uint64。uint64 在 R 包 int64 中定义。

编辑

这个问题是关于从 C unsigned int 数据类型到 uint64 R 语言数据类型的转换。

“已经开发了 int64 包,因此 64 位整数向量仅使用 R 数据结构表示,即数据不表示为指向某些 C++ 对象的外部指针。相反,每个 64 位整数表示为一对常规的 32 位整数,它们每个都携带底层 64 位整数的一半位。这是设计上的选择,以便可以将 64 位整数向量序列化并用作数据帧列。

4

1 回答 1

1

需要一个无符号整数才能存储至少介于 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 有符号和无符号整数

  1. 当整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则保持不变。
  2. 否则,如果新类型是无符号的,则在新类型可以表示的最大值的基础上重复加减一,直到该值在新类型的范围内。60)
  3. 否则,新类型是有符号的,值不能在其中表示;结果是实现定义的,或者引发了实现定义的信号。

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 相同的表示。

于 2013-01-20T20:57:28.860 回答