c - 如何将 unsigned int 转换为 uint64

标签 c r uint64

我想在 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 有符号和无符号整数

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

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/

相关文章:

r - 按月拆分日期期间并在必要时添加行

r - 使用标准评估更改 dplyr::count 中的变量名称

c++ - Visual Studio 2010 SP1 中的 64 位整数初始化错误

c - 将数据动态复制到二维字符数组时发生访问冲突

c - 无法通过 IDA 在 gdbserver 中设置断点

r - 轴标签中的绝对值

c - stdint.h 和 inttypes.h 之间的区别

c++ - 如何处理高于 7FF 的十六进制值...64 位和 uint64_t 类型

c - C 中运算符的结合性

c - 如何在基于 dpdk 的应用程序中启用 Debug模式?