暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Uint64 到底有多大

彪哥分晓 2021-09-11
5614

    


    最近我们在做自定义协议设计,正在考虑选型计数器用uint32还是uint64. 总担心数据类型选小了会导致“溢出”错误。哎,瞎操心的命又犯了!

    为了能让我睡的踏实,我们就看看这些数据类型在哪些情况下会“溢出”。

话不多说,直接上代码

    #include <stdint.h>


    int main()
    {
        for (uint64_t i = 0; i < 0xffffffff; i++) {}
    return 0;
    }

    不精确的做一下运行时间测试看看。

      time ./a.out 


      real 0m2.491s
      user 0m2.484s
      sys 0m0.001s

      这段代码是循环将 i 从 0 累加到 uint32。在我们2.5GHZ的CPU上一共运行了2.5s。平均CPU一个滴答做一次++。

      如果是 uint64呢?

        #include <stdint.h>


        int main()
        {
            for (uint64_t i = 0; i < 0xffffffffffffffff; i++) {}
        return 0;
        }

        算了,我的阿里云1C2G渣渣机直接卡死掉了。强烈不建议大家在单核机上运行如上代码。


        那uint64遍历一遍到底要多长时间

            无法测量那我们就只能计算一下了。

            uint32 运行了大约 2.5s,那uint64 就应该是 2^32 * 2.5s了 约等于 2^33 s 。

        这个时间有多大呢?

        一年大概是2^25s,那就相当于是2^8年,也就是约 128年


        那uint64能表示多大范围的数

            这里有一个大家经常用的东西IPv6 就是用两个uint64来表示一个地址的。

        据说IPv6的数量足够给地球上每一粒沙子分配一个IP,是不是足够的夸张。

        uint64 可以表示最大数,最著名的一个故事就是“棋盘上的米粒”了。在各种论坛上有从各个维度给大家科普这是一个多大的量级,我在这里就不再累诉了。


        一些骚想法

          for (;;) 


          // 无限循环就可以改写为如下循环,反正在有生之年是循环不完的
          for (uint64_t i = 0; i < 0xffffffffffffffff; i++)
          // 顺道还可以知道目前循环执行了多少次了


          文章转载自彪哥分晓,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论