【问题标题】:How to cast unsigned int to uint64如何将 unsigned int 转换为 uint64
【发布时间】:2013-01-20 20:20:41
【问题描述】:

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

编辑

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

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

【问题讨论】:

  • 像往常一样使用演员表。对于 64 位无符号整数,您必须有一个适当的 typedef,例如在 stdint.h
  • 呃,uint64 n = (uint64)k;,也许?
  • @PreetSangha 为什么,确切地说?将某些东西投射到 int64 是 OP 正在寻找的,不是吗?
  • @H2CO3 题名和正文不一样。我没有意识到。对不起!
  • @WojciechSobala 您需要将 int 转换为 int64 还是将 int 转换为 uint64?

标签: c r uint64


【解决方案1】:

需要一个无符号整数才能存储至少介于 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. 否则,如果新类型是无符号的,则在新类型可以表示的最大值的基础上反复加减一,直到该值在新类型的范围内。 60)
  3. 否则,新类型是有符号的,值不能在其中表示;结果是实现定义的,或者引发了实现定义的信号。

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

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2022-01-04
    相关资源
    最近更新 更多