讨论jiffies回转的time_after比较函数
本文讨论jiffies回转的比较函数:
#define time_after(a, b) \ ((long)(b) - (long)(a) < 0)
写了个例子如下:
#include <stdio.h> #include <stdint.h> #define time_after(a, b) \ ((long)(b) - (long)(a) < 0) int main() { unsigned long la = 0x8000000000000000; unsigned long lb; lb = la - 1; // la--; // lb--; printf("la: %llu, %lld, %d\n", la, la, sizeof(la)); printf("lb: %llu, %lld, %d\n", lb, lb, sizeof(lb)); if (time_after(la, lb)) { printf("la(%llu) after lb(%llu);\n", la, lb); printf("la(%lld) after lb(%lld);\n", la, lb); } else { printf("la(%llu) not after lb(%llu);\n", la, lb); printf("la(%lld) not after lb(%lld);\n", la, lb); } return 0; }
运行结果如下:
9223372036854775808 就是0x800000000000, 把它加一就变成负数了。
参考一下,int8的正负号序列:
于是这里有个问题:
9223372036854775807 - -9223372036854775808 = 18446744073709551615
为什么可以成立。
因为18446744073709551615 转化成有符号数 -1了。
另外回转有效的前题是,回转值小于1/2的max(uint64)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2023-10-08 大量client通过nat网关访问server的端口重用问题
2016-10-08 [daily][device][bluetooth] 蓝牙怎么办!(archlinux下驱动蓝牙鼠标,以及三星手机)