
最近我们在做自定义协议设计,正在考虑选型计数器用uint32还是uint64. 总担心数据类型选小了会导致“溢出”错误。哎,瞎操心的命又犯了!
为了能让我睡的踏实,我们就看看这些数据类型在哪些情况下会“溢出”。
话不多说,直接上代码
#include <stdint.h>int main(){for (uint64_t i = 0; i < 0xffffffff; i++) {}return 0;}
不精确的做一下运行时间测试看看。
time ./a.outreal 0m2.491suser 0m2.484ssys 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




