0.1.2 二进制补码

《编程导论(Java)·0.1.2 二进制补码》



p6:【冯?诺伊曼体系结构计算机使用二进制。人类之所以习惯十进制,据说是因为用手指头来计算比较方便,而人正好有10个指头。】

本节就2面(page6和p7)纸。虽然二进制补码属于每个程序员都应该熟练掌握的内容,但通常安排同学们自学。

重点要理解:为什么要采用补码?

将10进制数转换为二进制数时,负数如何在二进制中表达呢?为了讲解的方便,这里使用半个字节(Nibble)即4位为数据长度。

将最高位作为符号位是自然的想法。通常以0表示正、1表示负。去掉符号位后,正数就剩下的3位来表示0~7,0b0000~0b0111等称为原码。对于负数有一种简单但有问题的表示方式:符号加绝对值,如图0-4中间一列所示。

图 0?4 补码

它有两个问题(下面的01串不是正规的二进制表示,因而不加前缀0B):

  • 在整个0000至1111的编码中,出现了两个0,即0000和1000表示+0和-0。想判断一个数是否等于0的时候,会给编程带来麻烦。
  • 更关键的问题是,两个正数的加法与两个正数的减法(也即一个正数加一个负数)没有统一的运算法则。下面是出了问题的例子:

6-3 = 0110 + 1011 = 0001 = 1;

-3-2= 1011 + 1010 = 0101(有溢出) = 5

为了解决这些问题,计算机科学中,以二进制补码(the two’s complement)来编码数值。

负数的补码算法:将对应的正数每位取反,然后最低位加1。

例如求-5的补码如下:

对应的正数: 0b0101

每位取反:   0b1010

最低位加1:   0b1011

要求完成:

  • 练习0-11:有人找程序员借了500元钱,后来又想借500元,程序员说,干脆凑个整数,这是524块。为什么唐纳德·克努特给找出其巨著中任一错误的读者2.56美元?(请熟记2的各次幂)
  • 练习0-12:请严格地定义二进制补码规则。提示:符号位、正数的补码、负数的补码。(我们不给出二进制补码规则,仅介绍负数的补码算法,其他你自己搞定)
  • 练习0-13:数据长度为n位的有符号二进制整数,为什么最大正数为2n-1 -1?能够表示的最大负数为多少?(Java整形的取值范围)

  • 练习0-16:计算下列各题:(1)0x9AB4+0x5C; (2) 0170-023 ;(3) 0b1101*0b101


    练习0-17.:转换进制。(1) 0b1001_1100 = 0____;(2) 0x7F = 0b_______ ;(3) 0107 = 0b_________。

  • 在学习《第12章位运算》时,本节的知识是基础,很重要。
  • 最好的练习项目:整形算术编码。

0.1.2 二进制补码

时间: 2024-10-10 15:43:50

0.1.2 二进制补码的相关文章

二进制补码

一.概述     1.计算机系统的内部以二进制形式存储数据. 2.在Java程序中输入的十进制的数据都会被自动转换为二进制,Java内部也是以二进制来进行数值运算,但返回的结果是十进制. 二.补码规则     1.在计算机系统中,数值一律用二进制的补码来存储 2.二进制的最高位是符号位,0表示正数,1表示负数 3.正数的值是其本身,负数的值是最高位(符号位)不变,其它位逐位取反加一 4.两数相加,若最高位(符号位)有进位,则进位被舍弃. 三.为什么使用补码     1.可以将符号位和其他位统一处

35:输出二进制补码

35:输出二进制补码 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一个整型(int)的整数,输出它的32位二进制补码. 输入 一个整型整数. 输出 输出一行,即该整数的补码表示. 样例输入 7 样例输出 00000000000000000000000000000111‘ 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int a[10001]; 5 i

补码的求法以及八位二进制补码所能表示的数的范围

补码用来解决整数的存储问题,整数在计算机中是以二进制的补码形式进行存储的, 求十进制对应的二进制补码 1求正整数的二进制补码:正整数的二进制补码与其二进制原码相同, 2:求负整数的二进制补码:先求与该负数相对应的正整数的二进制代码,然后所有位取反加1,不够位数时左边补1,例如,求-3的二进制补码,先求3的二进制补码,3=11,取反之后为00,加1之后为01,假设用八位二进制表示,那么左边补6个1,也就是1111 1101. 3:0的二进制补码是0:关于0的补码你有一个误区,你觉得首先把0看做是+

深入理解二进制补码

文章来源 背景 大家都知道计算机内部采用补码表示整数的,但是具体到补码的内在含义,很多人不能理解,故我们分享自己的理解. 首先说下补码的定义以及基本性质: 1) 正数的补码和原码相同: 2) 负数的补码等于取反后加1: 3) 0的正负两种补码相同: 4) 对一个补码再求补码等于自己: 5) 一个正数的原码和其对应的负数的补码相加等于模: 针对本文,我们其实只关心规则1)和2)即可. 实例 为方便说明现有的补码定义(即正数的补码等于原码:负数的补码等于取反加1),本文均以八进制为例. 5 – 3

java基础 二进制补码

二进制补码: 1.计算机系统的内部以二进制形式存储数据. 2.在Java程序中输入的十进制的数据都会被自动转换为二进制,Java内部也以二进制来进行数值运算,但返回的结果是十进制. 二进制补码的原理: 正数+负数=模. 模:某种类型数据的总数,例如: 4位二进制数的模是2^4=16 8位二进制数的模是2^8=256 负数=模-正数,这就是逐位取反加1的原因. 1.在计算机系统中,数值一律用二进制的补码来存储. 2.二进制的最高位是符号位,0表示正数,1表示负数. 3.正数的值是其本身,负数的值是

输出二进制补码

题目链接:http://ica.openjudge.cn/dg2/2/ 总时间限制: 1000ms   内存限制: 65536kB 描述 输入若干int型整数,输出每个整数的二进制补码. 输入 输入有若干行,除最后一行外,每行包含一个int型整数.最后一行仅包含一个不定的字母,标志着输入结束.我们保证输入的整数不超出int型变量的表示范围 输出 个输入的整数,输出一行,即该整数的补码表示. 样例输入 1 7 200 -45 h 样例输出 00000000000000000000000000000

利用ZYNQ SOC快速打开算法验证通路(1)——MATLAB浮点数与定点二进制补码互转

最近本人一直在学习ZYNQ SOC的使用,目的是应对科研需要,做出通用的算法验证平台.大概思想是:ZYNQ PS端负责与MATLAB等上位机数据分析与可视化软件交互:既可传输数据,也能通过上位机配置更新硬件算法模块配置寄存器内容,同时可计算分析PL端算法实现性能指标.PL端的FPGA逻辑则负责算法的硬件实现,以探索高效并行硬件架构.为此本人后续会持续编写<利用ZYNQ SOC快速打开算法验证通路>系列专题博文,在各个阶段进行些基础性总结. MATLAB中数据为双精度浮点型,因此打开算法验证通路

关于二进制补码

转:http://www.ruanyifeng.com/blog/2009/08/twos_complement.html 问一个主要的问题. 负数在计算机中怎样表示? 举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢? 非常easy想到,能够将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数.比方,在8位机中,规定每一个字节的最高位为符号位.那么,+8就是00001000,而-8则是10001000. 可是,随便找一本<计算机原理>,都会告诉

笔试算法题(33):烙饼排序问题 &amp; N!阶乘十进制末尾0的个数二进制最低1的位置

出题:不同大小烙饼的排序问题:对于N块大小不一的烙饼,上下累在一起,由于一只手托着所有的饼,所以仅有一只手可以翻转饼(假设手足够大可以翻转任意块数的 饼),规定所有的大饼都出现在小饼的下面则说明已经排序,则最少需要翻转几次,才能达到大小有序的结果(改变饼的顺序只能整体翻转,不能相邻交换): 分析: 假设饼大小编号为1,--,N,1就是最小的饼,N就是最大的饼,最大的N饼翻转到最下面之前,一定需要达到最上面,所以首先需要寻找N饼所在的位置,翻 转到最上面,然后翻转所有的饼,这样N饼就可以就位: 然