如何将unsigned int转换为uint64

时间:2013-01-20 20:20:41

标签: c r uint64

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

修改

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

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

1 个答案:

答案 0 :(得分:0)

unsigned int需要能够存储至少0-65536范围内的值。 int64_t(来自<stdint.h>的可移植版本)将能够存储 - (2 63 -1)和2 63 之间的值。这里存在一个问题,即unsigned int的长度可能是64位,可能表示int64_t范围之外的值(参见C标准的§5.2.4.2.1p1和下面的部分)。

以下是标准所说的内容:

6.3.1.3有符号和无符号整数

  1. 当整数类型的值转换为_Bool以外的另一个整数类型时,如果该值可以用新类型表示,则它将保持不变。
  2. 否则,如果新类型是无符号的,则通过重复添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内。 60)
  3. 否则,新类型已签名且值无法在其中表示;结果是实现定义的,或者引发实现定义的信号。
  4. 60)规则描述了数学值的算术,而不是给定类型表达式的值。

    <小时/> 忽略对应于计算异常的实现定义信号是未定义的行为。

    对于未签名到签名的转换,我建议明确定义您的行为。饱和度是最简单的:当unsigned int值大于INT64_MAX时,转换将导致INT64_MAX。这看起来像x > INT64_MAX : INT64_MAX ? x。由于保证int64_t不包含填充,因此int64_t可以包含LIA样式(例如unsigned int x = UINT_MAX; ++x == 0),但是需要做更多工作才能保证可移植性。我建议像(x & INT64_MIN) > INT64_MAX ? -(x & INT64_MAX) : x & INT64_MAX这样的东西,如果你能找到一些断言,你的int64将具有与C标准int64_t相同的表示。