从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内核源代码的阅读及相关工具介绍 #### 引言 随着Linux系统的广泛应用与不断发展,深入了解其内部机制变得越来越重要。而理解Linux的核心部分——内核,最直接有效的方式便是阅读并分析其源代码。很多人对...
1. Linux 内核源代码的获取:Linux 内核源代码可以从多种途径获取,在安装的 Linux 系统下,/usr/src/linux目录下的东西就是内核源代码。另外还可以从互联网上下载,解压缩后文件一般也都位于linux目录下。 2. ...
Linux 0.11源代码是Linux操作系统早期版本的核心代码,对于想要深入理解Linux内核工作原理和系统架构的学习者来说,这是一个极好的起点。这个版本的代码相对简单,易于阅读,适合初学者逐步探索。 在Linux 0.11源...
使用Visual Studio 2015的工程源代码。 分析Linux动态库文件,进行32位,64位的文件判断,并进行elf的文件头分析。 在文件中查找特定字符串"version"。查找字符串可根据源码自行修改。 在windows下执行,有类似Linux...
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与C++结合的练习代码所涵盖的知识点,帮助你深入理解如何在Linux系统中高效地编写、编译和调试C++程序。 首先,了解Linux操作系统的基本命令是必要的。这包括文件和目录操作(如`cd`, `ls`, `...
在“精通Linux C编程源代码”这个主题中,我们探讨的是如何在Linux操作系统环境下使用C语言进行高效且灵活的程序开发。C语言是系统级编程的基石,而在Linux这一开源操作系统上,C语言更是得到了广泛的应用,从内核...
这份“Linux程序设计代码”资料是为那些希望入门Linux应用开发的学习者准备的,它将带你深入理解如何在Linux环境下编写高效且可靠的程序。 1. **Linux编程环境**:Linux是一个开源的操作系统,提供了丰富的开发工具...
《Linux内核源代码情景分析》是一本深入探讨Linux内核源代码的权威书籍,它为读者提供了全面、详尽的内核解析。该书的完整版特别加入了书签目录和超清文字版,使阅读体验更为便捷,同时也方便了读者进行检索和学习。...
"Linux C从入门到精通"这个主题涵盖了从基础知识到高级特性的全面学习路径,旨在帮助读者深入理解C语言以及如何在Linux操作系统上有效利用它。 首先,让我们从C语言的基础知识开始。C语言是一种强大的、低级的编程...
其中包含了"OpenSourceBootloader"和"linux示例代码"两个子目录,我们可以从中探索和学习到以下几个重要的Linux知识点: 1. **开源引导加载器(OpenSourceBootloader)**:引导加载器是系统启动时执行的第一个软件,...
《Linux内核源代码情景分析》是一本深入探讨Linux内核源码的权威书籍,它为读者揭示了操作系统内核的奥秘。本书通过详细的情景分析,将复杂的内核概念与实际应用相结合,帮助读者逐步理解Linux内核的工作原理。 在...
在这个CHM版本中,你可以找到Linux 0.11源代码的详细结构,包括函数、变量、宏定义等,以及它们之间的相互调用关系。这种交叉引用对于理解内核的工作原理、追踪代码流程以及学习如何编写和调试内核代码非常有帮助。 ...
源代码是理解和实践书本理论知识的关键,通过阅读和分析这些代码,读者可以更好地掌握Linux程序设计的精髓。 在Linux环境下进行程序设计,首先要了解的是基本的文件I/O操作。Linux系统是基于POSIX标准的,因此C语言...
Linux Ubuntu 五子棋游戏 C 语言代码解析 在 Linux 操作系统下,使用 C 语言开发的五子棋游戏代码是非常有趣和实用的编程项目。本文将对给定的代码进行详细的分析和解释,涵盖了操作系统、C 语言编程、图形化编程等...
Linux源代码是操作系统的核心,揭示了其内部工作原理和设计思想。这份"Linux源代码完整注释"提供了对原始版本Linux内核的深入理解和学习的机会。对于任何想要探索操作系统底层运行方式,或者打算进行系统级编程和...
测试代码:Linux共享库(动态库)与进程之间全局变量是无法共享
信号量是一个整型变量,可以用于控制对临界资源的访问。在这里,我们可以设置两个信号量:一个是表示缓冲区是否有空闲空间的`empty`,另一个是表示缓冲区是否包含数据的`full`。生产者在尝试填充缓冲区时会检查`...
本资源给出了Linux下进行RS485通信的实例代码
2. **符号搜索**:支持对符号(如函数、类、变量)的快速搜索,便于找到目标代码。 3. **依赖关系图**:通过图形化展示代码之间的依赖关系,有助于理解和重构代码。 4. **源代码高亮**:虽然kscope不强调编辑功能,...