从Linux代码反思整形以及无符号整形变量的知识
今日,在分析Linux调度器的过程中。
在sched.c中的init_cfs_rq中,看到了如下一条奇怪的赋值语句。
static void init_cfs_rq(struct cfs_rq *cfs_rq, struct rq *rq)
{
cfs_rq->tasks_timeline = RB_ROOT;
INIT_LIST_HEAD(&cfs_rq->tasks);
#ifdef CONFIG_FAIR_GROUP_SCHED
cfs_rq->rq = rq;
/* allow initial update_cfs_load() to truncate */
#ifdef CONFIG_SMP
cfs_rq->load_stamp = 1;
#endif
#endif
cfs_rq->min_vruntime = (u64)(-(1LL << 20));
#ifndef CONFIG_64BIT
cfs_rq->min_vruntime_copy = cfs_rq->min_vruntime;
#endif
}
min_vruntime是CFS调度算法中的一个记录某个CPU给分配给进程的最小虚拟时钟的值。 单位是ns。
可是如上的这种写法让我很郁闷。 看来自己的C语法还是不过关啊! 那么就baidu一下,进行学习一下吧。
整型分为无符号、有符号两种。
无符号的均表正数。
有符号的二进制第一位为1代表负数,第一位为0代表正数。
正数按正常二进制表示,负数存储时遵从以下规则:原码的补码(即原码的反码加1)。
下面就-5的反码进行分析如下(32位机器):
原码:00000000 00000000 00000000 00000101
反码:11111111 11111111 11111111 11111010
补码:11111111 11111111 11111111 11111011(-5 反码+1)
也就是说-5这个值存放在计算机里面是11111111 11111111 11111111 11111011这个数值。
那么如果有一个int类型的变量a, 对a进行复制a = -5, 并且有另一个unsigned int b, 将a进行强制类型转换无符号整形赋值给b。那么b的值会变成什么呢?
猜测是 b = 11111111 11111111 11111111 11111011, 转换成10进制为 b = 4294967291。
那么就写一个测试程序进行测试吧, 一切以事实说话。
下图是我写的一个测试程序:
运行结果如下图:
那么这个结果是正确的。
接下来在分析cfs_rq->min_vruntime = (u64)(-(1LL << 20));这条语句。
-1LL <<20
原码:00000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 (1LL <<20)
反码:11111111 11111111 11111111 11111111 11111111 11101111 11111111 11111111 反码
补码:11111111 11111111 11111111 11111111 11111111 11110000 00000000 00000000(-(1LL <<20) 反码+1)
那么cfs_rq->min_vruntime = 18446744073708593040
将上面的代码进行一定的修改如图:
运行结果如下:
OVER! 虽然简单, 但是还是蛮有意思的。 这里最重要的是了解计算机存储负数的规则。
参考了:
<!--EndFragment-->
相关推荐
在linux环境下编写一个控制台应用程序,程序中有一个共享的整型变量shared_var,初始值为0;创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中...
Linux C源代码Linux C源代码Linux C源代码Linux C源代码Linux C源代码Linux C源代码Linux C源代码Linux C源代码Linux C源代码Linux C源代码Linux C源代码Linux C源代码
linux内核源代码深度解析linux内核源代码深度解析linux内核源代码深度解析linux内核源代码深度解析linux内核源代码深度解析linux内核源代码深度解析linux内核源代码深度解析linux内核源代码深度解析linux内核源代码...
使用Visual Studio 2015的工程源代码。 分析Linux动态库文件,进行32位,64位的文件判断,并进行elf的文件头分析。 在文件中查找特定字符串"version"。查找字符串可根据源码自行修改。 在windows下执行,有类似Linux...
Linux 网络 代码Linux 网络 代码Linux 网络 代码Linux 网络 代码Linux 网络 代码Linux 网络 代码Linux 网络 代码Linux 网络 代码
内容介绍: Linux 拥有现代操作...源代码充分揭示了Linux作为操作系统内核是如何完成保证系统正常运行、协调多个并发进程、管理内存等工作 现实中能让人自由获取系统源代码并不多通过本书学习将大大有助于读者编写自己新
Linux 环境变量Linux 环境变量Linux 环境变量Linux 环境变量
Linux设置环境变量小结设置永久变量&临时变量 全局变量&局部变量
Linux源代码阅读知识点及要求.PDFLinux源代码阅读知识点及要求.PDFLinux源代码阅读知识点及要求.PDF
1.4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 ...
本资源给出了Linux下进行RS485通信的实例代码
linux下共享库注入技术代码库。
1. 先从网上下载jdk(jdk-1_5_0_02-linux-i586.rpm) ,推荐SUN的官方网站 www.sun.com ,下载后放在/home目录中,当然其它地方也行。 进入安装目录 #cd /home #cp jdk-1_5_0_02-linux-i586.rpm /usr/local #cd /usr/...
linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号...
里面包含有linux0.11版本的原版代码和 赵炯博士对里面所有代码的注释。
linuxptp源代码,需要的同学可以下载使用,最近正在弄需要时间同步的项目,大家可以一起看下
linux的源代码,下载于GitHub,时间节点2018.10.25,主要更新了显卡驱动
包含linux内核1.0的全部源代码,函数、变量精确定位,适合于linux工作者查阅浏览。
该代码已经建立好VS工程,方便在Windows阅读,配合《Linux内核源代码情景解析》可方便快速地学习Linux内核,提升对操作系统的理解和操作!
韦东山 嵌入式linux应用开发光盘代码韦东山 嵌入式linux应用开发光盘代码韦东山 嵌入式linux应用开发光盘代码韦东山 嵌入式linux应用开发光盘代码韦东山 嵌入式linux应用开发光盘代码