【问题标题】:How to initialize an _Extint() from an hardcoded litteral?如何从硬编码文字初始化 Extinct()?
【发布时间】:2020-12-15 16:10:33
【问题描述】:

我正在使用的 rust 项目依赖于fixed_hash 0.2.2。而且我需要将一个 H160 与文字进行比较(模式完全知道 my_var==0xdac17f958d2ee523a2206206994597c13d831ec7)。

在内部,H160 类型只是一个指向与_Extint() 一样编码的纯整数的指针。由于我已经需要将值传递给 C 模块,我正在考虑从那里进行比较。

问题是clang中的整数文字被读取为64位整数,所以

const _ExtInt(160) my_const=0xdac17f958d2ee523a2206206994597c13d831ec7;

fails with

<source>:1:28: error: integer literal is too large to be represented in any integer type

那么如何在大端中将0xdac17f958d2ee523a2206206994597c13d831ec7 分配给my_const

【问题讨论】:

  • 是您自己的类型还是某个库中的类型?请提供一个可重现的最小示例。
  • @PitaJ 你的意思是_Extint()?它是 clang 支持的非标准原生类型。 blog.llvm.org/2020/04/…
  • 您的链接表明 _ExtInt 文字未实现(“未来扩展”下的最后两段)。
  • @NateEldredge 但 6 个月后,它成为 clang 版本 12 的一部分。
  • but 6 months later, it s part of clang version 12 你有这方面的参考吗?如果是,你为什么不使用它?

标签: c rust clang extint


【解决方案1】:

从较小的值构造它并移位。

const _ExtInt(160) my_const = 
    (unsigned _ExtInt(160))0xdac17f95ull << 128 |
    (unsigned _ExtInt(160))0x8d2ee523a2206206ull << 64 |
    (unsigned _ExtInt(160))0x994597c13d831ec7ull << 0;

【讨论】:

  • 当机器是小端时,如何在大端中做到这一点? (这是我的情况,因为 H160 在大端生锈)
  • 我想_ExtInt(160) 将永远是本地字节序。如果你想确保数据是大端的,只需传递一个字节数组。
  • And how to do it in big endian when the machine is in little endian? 我不明白。值的 C 表示始终是左侧的 MSB,与字节序无关。如果您想切换值的特定字节,这将导致特定字节存储在特定架构的特定位置,那只是一个映射和数学运算。 C 非常适合做数学运算,它有 &lt;&lt; &gt;&gt;&amp; | 运算符。
  • @KamilCuk 将与之进行比较的 _ExtInt 作为字节数组从网络接收。 x86 是小端。因此需要在网络字节顺序中将常量分配给my_const
  • @PitaJ 我应该如何将字节数组传递给它?
猜你喜欢
  • 2018-03-21
  • 2017-03-13
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2018-06-25
  • 2016-05-02
  • 1970-01-01
相关资源
最近更新 更多