目录

一、综述

二、整数

2.1 整数的表示

2.1.1 ones' complement & two's complement

2.1.2 有符号数和无符号数的转化关系

2.1.3 数的扩展

2.2 整数的运算

2.2.1 无符号加法

2.2.1 补码加法

三、数的特性对C编程的影响

3.1 无符号数和有符号数

3.1.1  数

3.1.1 cast

3.1.2 extension

3.1.3 shift

3.1.4 overflow

3.1.5 C中的余数

四、参考


一、综述

计划对程序中一些细节背后的机制进行记录,本篇相当于CSAPP第二章笔记,没有追求面面俱到,只是重读CSAPP时将自己有些遗忘的或者不是很清楚的概念进行梳理,备忘。

二、整数

2.1 整数的表示

2.1.1 ones' complement & two's complement

先介绍百度百科(https://baike.baidu.com/item/%E8%A1%A5%E7%A0%81/6854613?fr=aladdin)模的概念:

“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。例如:

时钟的计量范围是0~11,模=12。表示n位的计算机计量范围是0~2^(n)-1,模=2^(n)。

“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。

如对于一个8bit的数的计量器,其模为2^8,由于模在计量器上表示不出来,那么a + b = a + b + n * 2^8(n是整数)

再介绍补码的概念:补码来源于以下思想——如果一个正整数为A,那么其对应的负整数可以用-A来表示,可以用 -A = 0 - A来得到,由于0需要借位,在计算机的二进制表示中(假设数长度w bit) -A用 2^w - A表示,称为补码,上述表达式只有一个‘2’,因此称为two‘s complement区别于ones’ complement,反码来源于对原码取反,其结果相当于用[1111...11] - A,所以称为ones' complement(注意两种表示的 ‘s和s‘)。

所以,计算机中的整数采用补码表示,主要原因是

  1. 相比于ones‘ complement有+0和-0这种编码,补码中的0只有一个。
  2. 补码可以直接进行运算, 计算机中的数都是计数范围有限的计量系统(假设模2^w),因此X-Y 可以根据模的性质转换成X -Y+2^w = X + (2^w - Y),即整数的减法可以转换成加上Y的补码,而补码本身又可以通过取反加一实现,简化了电路设计。一个减法过程的示意:

补码的数学表达式也是理解补码的一种方式:最高位的权重是-2^(w - 1)

2.1.2 有符号数和无符号数的转化关系

记住下面两个公式就行了

2.1.3 数的扩展

在不同的字长的整数之间进行转换,分为以下两种:

  1. zero extension(零扩展),如将无符号数转换为更大的数据类型,补0
  2. sign extension(符号扩展),将一个补码数字转换为更大的数据类型,扩展符号

TIPS:一个负数前面的1都可以忽略,因此0xfffffffc,可以看做4-bit 1100(c),即 -8 + 4 = -4

2.2 整数的运算

2.2.1 无符号加法

2.2.1 补码加法

三、数的特性对C编程的影响

3.1 无符号数和有符号数

3.1.1  数

C中的数值默认是有符号的,如果指定是无符号的需要使用U后缀

3.1.1 cast

分为显示转换和隐式转换。

注意隐式转换带来的特殊之处:对同时包含有符号和无符号的表达式,会将有符号的数转换成无符号的数处理,尤其当涉及<和>这样的关系表达式,要十分小心。

-1 < 0U      //0xFFFFFFFF < 0U

0U - 1        // 0xFFFFFFFF

4U - 5U     //  0xFFFFFFFF

TIPS:  在CSAPP中有如下问题

#define INT_MAX   2147483647
#define INT_MIN   (-INT_MAX - 1)

这里INT_MIN不定义成-2147483648或者0x80000000的原因是-2147483648是一个表达式,其中2147483648超出的int上限,于是将该数解释成了long int类型(按照int/long int/long long int 匹配数字大小),再取-就达不到目的了。因此用(-INT_MAX - 1)实现。

3.1.2 extension

数进行扩展时,一定是先改变大小,再做有符号/无符号的变化,写代码时最好避免隐式转换,如short ->unsigned,实际的转化过程unsigned = (unsigned)(int)short。

3.1.3 shift

逻辑右移(补0)和算数右移(补符号),C中无符号数的右移是逻辑的,有符号的数是算数右移。如果移位很大,会对数的位数w取模。

3.1.4 overflow

溢出检测程序:

//无符号溢出条件检测证明:
令s = x + y
0 <= x, y < 2^w
当没有产生溢出时,s - x = y >=0, 即 s >= x
当产生溢出时, s - x = x + y - 2^w - x = y - 2^w < 0, 即 s < x
这里x,y的位置可以互换。int uadd_ok(unsigned int x, unsigned int y) {unsigned int s = x + y;return s >= x;
}补码溢出的检测条件
正溢出:x >= 0, y >= 0, 但 x + y < 0
负溢出: x < 0, y < 0, 但 x + y >= 0int tadd_ok(int x, int y) {int z = x + y;return !(x >= 0 && y >= 0 && z < 0) && !(x < 0 && y < 0 && z >= 0)
}

3.1.5 C中的余数

C的余数和被除数符号保持一致,如果要余数永远是正值,使用

  • ((n % M) + M) % M

更多的讨论参见C and Python - different behaviour of the modulo (%) operation

四、参考

【1】关于2的补码

【2】深入理解计算机系统 第三版

编程基础(一)——计算机中的数相关推荐

  1. 计算机有关的基础知识,计算机基础知识之计算机中有关数及编码的知识

    1.4 计算机中有关数及编码的知识 1.计算机是智能化的电器设备 计算机就其本身来说是一个电器设备,为了能够快速存储.处理.传递信息,其内部采用了大量的电子元件,在这些电子元件中,电路的通和断.电压高 ...

  2. 计算机十进制数中码数有几个,计算机中的数和码

    <计算机中的数和码>由会员分享,可在线阅读,更多相关<计算机中的数和码(27页珍藏版)>请在人人文库网上搜索. 1.第第1章章 计算机中的数和码计算机中的数和码 微机系统原理及 ...

  3. 计算机中有关数及编码的知识,计算机中有关数及编码的知识

    计算机中有关数及编码的知识 1.计算机是智能化的电器设备 计算机就其本身来说是一个电器设备,为了能够快速存储.处理.传递信息,其内部采用了 大量的电子元件,在这些电子元件中,电路的通和断.电压高低,这 ...

  4. 计算机中的数(二):定点数的移位运算和加减运算

    参考资料: 张代远<计算机组成原理教程 第二版>清华大学出版社 唐朔飞<计算机组成原理>高等教育出版社 <2012计算机组成原理 联考复习指导>机械工业出版社 &l ...

  5. 计算机中的数(一):数在计算机中的表示

    参考资料: 唐朔飞<计算机组成原理>高等教育出版社 张代远<计算机组成原理教程 第二版>清华大学出版社 <另一个视角解读计算机编码-补码编码> <补码初探&g ...

  6. 编程基础:计算机相关知识

    前言: 知不足,然后能自反也:知困,然后能自强也. 本文为笔记性质,主要内容来自慕课网咚咚呛老师的课程<编程必备基础:计算机组成原理+操作系统+计算机网络>. 课程大纲 正文: 计算机发展 ...

  7. 计算机中关于数符的表示方法

    目录 一.数字的分类 二.整数 1.无符号数 2.有符号数 (1)原码 (2)反码 (3)补码 三.小数 1.定点法 2.浮点法 在计算机中,数据都是采用二进制进行表示储存的,就是只有0和1两个元素进 ...

  8. 一、编程基础之计算机基础知识

    1.1 整体概述计算机系统 计算机系统分为硬件系统和软件系统两个部分. 硬件:就是我们平时都能看得见的机械零件.不同种类的计算机,硬件系统的组成也会不相同. 软件:是程序.数据以及相关文档的总称. 程 ...

  9. 总结计算机中十进制数二进制数,计算机中十进制转换为二进制的新方法

    计算机,考试必备! 计算机中十进制转换为二进制的另一方法 -------"定位减权法" 胡燏 (四川建筑职业技术学院计算机系,618000) [摘要]本文从十进制与二进制的特点入手 ...

  10. 十进制-75在计算机中,十进制数75转换成二进制数是多少?

    75转换成二进制是:1001011. 75/2=37......1 37/2=18......1 18/2=9.........0 9/2=4...........1 4/2=2........... ...

最新文章

  1. 参数等效模型可以用于_等效媒质理论(介电参数反演)
  2. 为什么阿里巴巴开发手册明确说明 Arrays.asList() 不能使用其修改方法
  3. Java 四种引用类型:强引用、软引用、弱引用、虚引用
  4. Webpack 4 + React + Typescript 搭建启动模版
  5. Apache Shiro 使用手册(四)Realm 实现
  6. 每天一个linux命令--定时启动
  7. 运算符的优先级总能起作用吗?
  8. javascript的事件冒泡,阻止事件冒泡和事件委托, 事件委托是事件冒泡的一个应用。...
  9. 帝国cms listinfo.php,帝国CMS动态列表应用之在列表中显示指定的会员组会员发布的信息...
  10. java多线程入门1
  11. 支持iCloud简记
  12. UOJ #357. 【JOI2017春季合宿】Sparklers
  13. php yii 控件分页,Yii实现简单分页的方法
  14. TCP完成端口服务器构建
  15. 公交线路换乘代码PHP,北京公共交通集团-|线路查询|公交换乘|商务班车|定制公交|公交e路通|实时公交...
  16. ARM9和STM32什么关系?
  17. python统计套利_基于python的统计套利实战(四)之策略实现
  18. 教你炒股票29:转折的力度与级别
  19. 现在怎么不生产5寸大小的手机了?
  20. 自动滑动背景图片html,html背景图片滚动属性bgproperties

热门文章

  1. 【转载】SQL Server XML Path
  2. .net System.IO之Stream的使用详解
  3. FOREACH的遍历
  4. Audio / Video Playback
  5. nginx实战(五) 正向代理支持https
  6. jQuery 前后端分离项目总结
  7. Vue.js 关于router传参那点事儿
  8. SQLLDR载数加速,优化参数
  9. Anonymous推荐软件含有恶意***程序
  10. Lucene4:创建一个简单查询