`
freesoftman
  • 浏览: 318838 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

从Linux代码反思整形以及无符号整形变量的知识

 
阅读更多

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_vruntimeCFS调度算法中的一个记录某个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!   虽然简单, 但是还是蛮有意思的。  这里最重要的是了解计算机存储负数的规则

 

参考了:

http://blog.sina.com.cn/s/blog_676f9c520100u8fl.html

<!--EndFragment-->
  • 大小: 56.7 KB
  • 大小: 63.3 KB
  • 大小: 67.6 KB
  • 大小: 58.2 KB
分享到:
评论

相关推荐

    进程和线程的创建(linux) 源代码

    在linux环境下编写一个控制台应用程序,程序中有一个共享的整型变量shared_var,初始值为0;创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中...

    用Source Insight打开linux内核源代码

    1. Linux 内核源代码的获取:Linux 内核源代码可以从多种途径获取,在安装的 Linux 系统下,/usr/src/linux目录下的东西就是内核源代码。另外还可以从互联网上下载,解压缩后文件一般也都位于linux目录下。 2. ...

    linux 0.11 源代码

    Linux 0.11源代码是Linux操作系统早期版本的核心代码,对于想要深入理解Linux内核工作原理和系统架构的学习者来说,这是一个极好的起点。这个版本的代码相对简单,易于阅读,适合初学者逐步探索。 在Linux 0.11源...

    Linux动态库文件符号分析源代码

    使用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 C源代码

    精通LinuxC编程源代码

    在“精通Linux C编程源代码”这个主题中,我们探讨的是如何在Linux操作系统环境下使用C语言进行高效且灵活的程序开发。C语言是系统级编程的基石,而在Linux这一开源操作系统上,C语言更是得到了广泛的应用,从内核...

    Linux程序设计代码

    这份“Linux程序设计代码”资料是为那些希望入门Linux应用开发的学习者准备的,它将带你深入理解如何在Linux环境下编写高效且可靠的程序。 1. **Linux编程环境**:Linux是一个开源的操作系统,提供了丰富的开发工具...

    Linux内核源代码情景分析(完整版-带书签目录超清文字版).pdf

    《Linux内核源代码情景分析》是一本深入探讨Linux内核源代码的权威书籍,它为读者提供了全面、详尽的内核解析。该书的完整版特别加入了书签目录和超清文字版,使阅读体验更为便捷,同时也方便了读者进行检索和学习。...

    linux源代码下载

    本文将围绕“Linux源代码下载”这一主题展开,详细讲解如何获取和理解Linux操作系统的源代码,以及这对于编程和学习C语言的意义。 首先,Linux是一个基于Unix的操作系统,其内核由林纳斯·托瓦兹(Linus Torvalds)...

    Linux源代码阅读知识点及要求.PDF

    Linux源代码阅读知识点及要求.PDFLinux源代码阅读知识点及要求.PDFLinux源代码阅读知识点及要求.PDF

    linux内核源代码情景分析 pdf版 高清

    《Linux内核源代码情景分析》是一本深入探讨Linux内核源码的权威书籍,它为读者揭示了操作系统内核的奥秘。本书通过详细的情景分析,将复杂的内核概念与实际应用相结合,帮助读者逐步理解Linux内核的工作原理。 在...

    Linux0.11版源代码交叉引用 CHM版本&&Linux Source v0.11 Documentation

    在这个CHM版本中,你可以找到Linux 0.11源代码的详细结构,包括函数、变量、宏定义等,以及它们之间的相互调用关系。这种交叉引用对于理解内核的工作原理、追踪代码流程以及学习如何编写和调试内核代码非常有帮助。 ...

    Linux 程序设计第三版源代码

    源代码是理解和实践书本理论知识的关键,通过阅读和分析这些代码,读者可以更好地掌握Linux程序设计的精髓。 在Linux环境下进行程序设计,首先要了解的是基本的文件I/O操作。Linux系统是基于POSIX标准的,因此C语言...

    c 语言进阶经典——LINUX 源代码分析

    《C语言进阶经典——LINUX源代码分析》是一本深度探讨C语言在操作系统层面上应用的著作,尤其聚焦于Linux这一开源操作系统的核心代码。这本书是C语言爱好者和系统程序员的宝贵资源,它不仅教授了C语言的高级技巧,还...

    在linux下ubuntu的五子棋游戏c语言代码(20220212161732).pdf

    Linux Ubuntu 五子棋游戏 C 语言代码解析 在 Linux 操作系统下,使用 C 语言开发的五子棋游戏代码是非常有趣和实用的编程项目。本文将对给定的代码进行详细的分析和解释,涵盖了操作系统、C 语言编程、图形化编程等...

    linux 源代码完整注释

    Linux源代码是操作系统的核心,揭示了其内部工作原理和设计思想。这份"Linux源代码完整注释"提供了对原始版本Linux内核的深入理解和学习的机会。对于任何想要探索操作系统底层运行方式,或者打算进行系统级编程和...

    【测试代码】Linux共享库(动态库)与进程之间全局变量是无法共享

    测试代码:Linux共享库(动态库)与进程之间全局变量是无法共享

    生产者消费者 Linux代码

    信号量是一个整型变量,可以用于控制对临界资源的访问。在这里,我们可以设置两个信号量:一个是表示缓冲区是否有空闲空间的`empty`,另一个是表示缓冲区是否包含数据的`full`。生产者在尝试填充缓冲区时会检查`...

    Linux RS485 通信代码

    本资源给出了Linux下进行RS485通信的实例代码

Global site tag (gtag.js) - Google Analytics