我想将unsigned int转换为C函数内的uint64。uint64在R包int64中定义。
编辑这个问题是关于C语言unsigned int数据类型到uint64 R语言数据类型的转换。
"int64包已经开发,因此64位整数向量仅使用R数据结构表示,即数据不表示为指向某些c++对象的外部指针。相反,每个64位整数表示为一对常规32位整数,每个整数携带底层64位整数的一半位。这是设计上的选择,以便64位整数向量可以序列化并用作数据帧列。"
unsigned int必须能够存储至少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
。包装LIA样式(例如:unsigned int x = UINT_MAX; ++x == 0
)对于int64_t是可能的,因为保证int64_t不会包含填充,但是需要做更多的工作来保证可移植性。我建议类似(x & INT64_MIN) > INT64_MAX ? -(x & INT64_MAX) : x & INT64_MAX
的东西,如果你能找到一些断言,你的int64将具有与C标准int64_t相同的表示。