【问题标题】:how to test if unsigned __int64 number exceeds range如何测试无符号 __int64 数是否超出范围
【发布时间】:2013-08-24 15:35:13
【问题描述】:

我有一个函数,计算值可以达到比无符号 __int64 范围更高的值,MS 用 18,446,744,073,709,551,615 表示。如何测试一个数字是否超出了该范围?我已将 int 转换为 char 并尝试通过使用 strlen 检查长度来进行测试。但是,某些长度超过指定长度的值:例如 if(strlen(charvar)>17) 会神秘地转义。那么如何才能有效地进行测试呢?

【问题讨论】:

  • 这是为了从字符串转换为数字吗?什么语言? (类似 C,但是是 C 还是 C++?)
  • C++,它用于使用 OpenCV 在图像中显示值(所以我需要使用 _ui64toa 将它们转换为字符)。我只想显示“正确”的。显示它们是没有问题的,但如果我使用 strlen 函数来删除有问题的函数,它并不总是有效。
  • VS 2008,什么是boost?来看看,是不是有一些简单的测试方法呢?如果我可以测试数字是否超过 19 或 18 就足够了。

标签: testing char range int64


【解决方案1】:

如果您可以使用现代编译器或 Boost,那么 lexical_cast 就可以完成这项工作:

uint64_t bigint;
try {
    bigint = lexical_cast<uint64_t>(str);
} catch (std::bad_lexical_cast &e) {
    // do whatever you want to do when the string isn't valid;
}
// Safely use bigint

有关 Boost 库,请参阅 this link。你绝对可以在 VS 2008 上得到这个。

如果这是仅限 Windows,您还可以查看 _atoi64 等。见msdn。这些返回 I64_MAXI64_MIN 以防上溢/下溢。

【讨论】:

  • 我收到错误 C2065: 'lexical_cast' : undeclared identifier,所以我想我需要安装 Boost。如果没有更简单的解决方案,我可能会尝试寻找替代方案(我可以测试图像中数字的宽度)。谢谢你的帮助!
  • 您需要迁移到 VS2012 (VC 11) 才能从工作室获取这些内容。 Boost 会将它们放在boost:: 命名空间中。但是_atoi64 可能就足够了。
  • _atoi64 听起来很有希望。我试试看。
  • 我在我的代码中发现了一个错误,我把 if 条件放在了 display number 命令之后。必须反之亦然。这就是为什么有些数字似乎没有用 strlen 正确测量长度的原因。现在它起作用了。顺便说一句,您对 _atoi64 的建议也很有效(尽管对于 __int64),所以我会将您的答案标记为已接受的答案。以下是所有大惊小怪的原因:videocrack.npage.de/pascalt.html 灰色数字是那些太大,因此“不正确”的数字
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 2014-12-16
相关资源
最近更新 更多