C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 二进制补码表示大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我最近一直在为稍微修改过的 Abstract Syntax Notation实现一个专门的解析器.规范说整数被编码为一个八位字节数组,它被解释为二进制二进制补码整数.

所以,起初我认为将其反序列化为实际的c int的最佳方法是简单地以值0开始,然后将每个八位字节的OR与值类似:

uint64_t value = 0;
int shift = 0;
std::vector<uint8_t> octets = { /* some values */ };

for (auto it = octets.rbegin(); it != octets.rend(); ++shift,++it)
{
  value |= uint64_t(*it) << (shift * 8);
}

这会让我有一个存储在值中的位模式,然后我可以通过强制它将其解释为带符号(二进制补码)整数:

int64_t signed_value = static_cast<int64_t>(@R_944_7548@;

但在我看来,这实际上是依赖于实现定义的行为.因此,为了将编码整数的实际值作为c int64_t,我需要实际计算位模式中每个第n位的2 ^ N的总和,同时虑符号位.当我知道铸造应该在大多数时间工作时,这似乎有点傻.

这里有更好的解决方案既便携又高效?

解决方法

如果您的解决方案有效,我认为您可以使用一些元编程来测试您的平台是一个补码还是两个补码.

struct is_ones_complement {
    static const bool value = ( (1 & -1) == 0);
}

然后,您可以编写一个无限转换函数

template<bool is_ones_complement>
uint64_t convert_impl(const std::vector<uint8_t>& vec);

template<>
uint64_t convert_impl<true>(const std::vector<uint8_t>& veC) {
    // Your specialization for 1's-complement platforms
}

template<>
uint64_t convert_impl<false>(const std::vector<uint8_t>& veC) {
    // Your specialization for 2's-complement platforms
}

inline uint64_t convert(const std::vector<uint8_t>& veC) {
    return convert_impl<is_ones_complement::value>(vec);
}

未经测试,但它应该工作.

大佬总结

以上是大佬教程为你收集整理的c – 二进制补码表示全部内容,希望文章能够帮你解决c – 二进制补码表示所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。