【问题标题】:convert uint64 to uint32将 uint64 转换为 uint32
【发布时间】:2011-02-07 05:45:33
【问题描述】:

我有一个 uint64 变量...但我想传递它的函数只接受 uint32。

我尝试使用 static unsigned int ToUInt32(uint64 variable); 参考 MSDN,但它给出了精度丢失的错误。

有什么方法可以将 uint64 转换为 uint32 而不会丢失任何数据?

【问题讨论】:

  • 了解 uint64 的来源、此函数的作用以及为什么要调用它可能会有所帮助。

标签: c++


【解决方案1】:

好好想想你想做什么。您正在获取一个可能占用 64 位的数字,然后将其减半。 当然,在这种情况下你会丢失数据。

如果你确定给出的数字不会大于 uint32,那么你可以试试这个

uint64 largeNumber = 9876543210;
uint32 smallNumber = largeNumber & 0xFFFFFFFF;

但是如果大于 32 位,这将失去你一半的数字。

【讨论】:

    【解决方案2】:

    没有。你不能将 2 加仑的水放入 1 加仑的容器中,也不能将 64 位的数据放入 32 位的值中。

    【讨论】:

    • 实际上水的压缩效果比数字好得多。给定压力为 X 的两加仑水,对于一加仑体积的相同质量,很可能存在一个可行的压力 Y。
    • @Fred 我刚刚想起了巨蟒和非洲燕子。 +1!!
    • @Fred 真的吗?我的高中科学老师告诉我水是不可压缩的。诅咒,又被骗了! (加上数字有时也是可压缩的……zlib 可以处理非常大的、不那么随机的数字)
    • 找到了这个链接:hyperphysics.phy-astr.gsu.edu/hbase/permot3.html,它为您提供了在水上可以达到的压缩量公式。 “在太平洋底部,深度约 4000 米……体积压缩分数仅为 1.8% 左右”,因此,如果您要说的话,也许在我们银河系中心附近的某个地方,据说那里有一个巨大的黑洞在那里夹 2 加仑的水,它会装满一个 1 加仑的容器(假设容器足够坚固,可以承受孔的力量!)
    【解决方案3】:

    没有。 32 位整数比 64 位整数少 32 位。 64 位整数可以包含 32 位整数可以包含的任何内容,反之则不行。

    【讨论】:

      【解决方案4】:

      有什么方法可以将 uint64 转换为 uint32 而不会丢失任何数据?

      是的,但前提是您知道可能的 uint64 值的某些特征并且这些特征允许无损转换。

      这里最可能相关的是知道您的值永远不会超过 uint32 的最大值。在这种情况下,您实际拥有的是存储在 64 位中的 32 位值,并且转换只是更改它的存储方式而不是更改值。在这种情况下,要进行转换,只需进行转换,例如使用 static_cast。

      如果您想处理任意 uint64 值,那么这根本是不可能的。如果可能的话,您可以通过重复应用转换将任何文件(包括 40 TB 的数据库)压缩到单个 32 位值。

      【讨论】:

        猜你喜欢
        • 2015-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-24
        • 2010-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多