计算机中的原码,反码,补码,以及他们在内存中的存储形式。

1.原码

原码就是早期用来表示数字的一种方式: 一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码

      举例说明:

      int类型的 3 的原码是 11B(B表示二进制位), 在32位机器上占四个字节,那么高位补零就得:

      00000000 00000000 00000000 00000011

      int类型的 -3 的绝对值的二进制位就是上面的 11B 展开后高位补零就得:

      10000000 00000000 00000000 00000011      

      但是原码有几个缺点,

a.零分两种 +0 和 -0 。

b.在进行不同符号的加法运算或者同符号的减法运算的时候,不能直接判断出结果的正负。需要将两个值的绝对值进行比较,然后进行加减操作,

最后符号位由绝对值大的决定。于是反码就产生了。

2.反码    

正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反

      举例说明:

      int类型的 3 的反码是

      00000000 00000000 00000000 00000011

      int类型的 -3 的反码是

      11111111 11111111 11111111 11111100

      除开符号位 所有位 取反

      解决了加减运算的问题,但还是有正负零之分,然后就到补码了

3.补码

正数的补码与原码相同,负数的补码为 其原码除符号位外所有位取反(得到反码了),然后最低位加1.

      还是举例说明:

      int类型的 3 的补码是:

      00000000 00000000 00000000 00000011

      int类型的 -3 的补码是

      11111111 11111111 1111111 11111101

      就是其反码加1

总结:

a.正数的反码和补码都与原码相同。

b.负数的反码为对该数的原码除符号位外各位取反。

c.负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1  

d.原码好理解了,但是加减法不够方便,还有两个零(正负0)

e.反码稍微困难一些,解决了加减法的问题,但还是有两个零

f.补码理解困难

4.数在内存中都是以补码形式存在的

对于一个负数-x,它的二进制表示(补码)求法如下:

a.对x的原码进行取反运算

b.将取反运算的结果+1

  对于大多数语言来说,char类型的有效范围是-128~127,那么如果我们把128这个超过了char类型表示范围的数赋值给一个char型变量ch,结果会怎样呢?ch的值会变成0,还是其它值?答案是,ch的值会变成-128,因为128超越了最大值127,于是它开始从最小值开始,搜索一个合适的位置。同样的道理,将129赋值给ch,ch的值会变成-127。

  还有一个原理就是有符号和无符号数据的区别。我们知道,char也分为signed和unsigned两种,前者是默认值,而后者的表示范围是0~255。不管有无符号,这个区间的大小都是256,这也在情理之中,毕竟1个字节由8个位组成,每个位可以取0或1,那么一共就能表示2^8种不同的情况,2^8就是256。

同时,根据上面的理论,我们可以得出,将255赋值给ch,结果是-1。我们可以分别求出255和-1的补码,它们都是11111111。当然,这不是什么巧合,这是有科学道理的。255是unsigned char的最大值,它也是signed char能表示的负数中的最大值。当一个char是unsigned类型的时候,它的第一位自然不会被认为是符号位,所以11111111能表示255,而当这个char是signed类型时,第一位被解析成符号位,结果就是-1了。

c.对绕回和同余的解释

-336的无符号整数是65200呢?书上说是2的补码(书中描述):数字0到32767代表它们本身,而数字32768到65535则代表负数,65535代表-1,65534代表-2,依次类推,因此-336由65536-336,也即65200来表示;

d.同余

很多人并不理解补码。补码就是同余啊。1000000是正128你知道吧,正负128模256是同余的。加减乘可以直接算也是同余的定理决定的,而不是凑出来的巧合,哪可能凑出这种东西?

8位只能表示256个数,0到255,但我还想表示一些负数怎么办呢?就用与该负数同余的正数来表示呗。-1=255,-2=254,等等。

建议脱离算数的思维方式,这其实就是一个环。模任何一个正整数(如256),可以把所有整数分类,比如模256可分256类,0 256 -256...是一类(余0类),1 257 -255...是一类(余1类),等等,这256类可看作环的元素,你看-128和128是同一个类里的(余128类),用一个代表另一个罢了。补码和普通的unsigned integers都是在每类中选一个数,unsigned integers选0到255,补码表示的有符号整数选-128到127,都是一个数恰好对应一个类。

当你明白这一切后,补码就是顺理成章的事。

e.8位有符号数的列表   内存中8位二进制10000000表示 -128

-1<--->11111111   -2<--->11111110   -126<--->10000010   -127<--->10000001   -128<--->10000000

127<--->01111111   126<--->01111110   125<--->01111101   002<--->00000010   001<--->00000001   000<--->00000000

原文地址:https://www.cnblogs.com/mydomain/p/9978694.html

时间: 2024-10-08 05:22:28

计算机中的原码,反码,补码,以及他们在内存中的存储形式。的相关文章

计算机中的原码,反码,补码与移码

在计算机内,定点数有3种表示法:原码.反码和补码. 原码:就是二进制定点表示法,即最高位为符号位,0表示正,1表示负,其余位表示数值的大小 反码:正数的反码与其原码相同:负数的反码是对其原码逐位取反,但符号位除外.       原码10010=反码11101(10010,1为符号位,故为负) 补码:正数的补码与原码相同,负数的补码是对其原码逐位取反,但符号位除外,然后整个数加1 如果补码的符号位为0,则表示一个正数,其原码就是补码如果补码的符号位为1,则表示一个负数 移码:移码与补码的关系: [

原码,反码,补码详解及 Java中&gt;&gt;和&gt;&gt;&gt;的区别

前两天分析 HashMap 的 hash 算法的时候,遇见了 >> 和 >>> 这两个符号,当时查了下资料,在脑子中过了一下.今天又碰到了,没想到竟然忘了  0-0........ 我这记忆力哎,不说了.只好做个笔记,提醒自己,遇到啥不会的最好记下来,好记性不如烂博客啊~ 既然涉及到位运算,我们追本索源,就先从最基础的原码,补码和反码学起.搜了一下这方面的资料,发现一篇专门介绍这方面的文章,写的很是透彻,便直接引用过来了,原文地址是:http://www.cnblogs.co

二进制中的原码反码补码

二进制中的原码.反码.补码 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1]原 = 0000 0001 [-1]原 = 1000 0001 第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是: [1111 1111 , 0111 1111] 即 [-127 , 127] 原码是人脑最容易理解和计算的表示方式. 2. 反码 反码的表示方法是: 正数的反码是其本身 负数的反码是在其原码的基础上, 符号位不变,其余

原码 反码 补码 以及 为什么要使用原码反码补码

原始博文网址,无意侵权,只是想记下来以后复习的时候方便, http://www.cnblogs.com/cumtchw/p/4523332.html http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html 机器数 一个数在计算机中的二进制表示形式,叫做这个数的机器数,机器数是带符号的,在计算机中用一个数的最高位存放符号,正数为0,负数为1,比如,十进制中的+3,假设计算机字长为8位,转换成二进制就是0000 0

&lt;13&gt;【了解】计算机中的进制+【理解】原码反码补码基本概念+【理解】为什么要引入反码、补码?+【掌握】位运算符介绍及使用+位运算应用:编程实现10进制转2进制

1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) { 4 5 //定义10进制数,打印出10.8.16进制的值 6 int a = 13; 7 printf("%d\n",a); 8 printf("%o\n",a); 9 printf("%x\n",a); 10 11 //int 64 4个字节 12 int b = 0b0000000000000000

c语言中的原码,补码,反码的小结。

1.正数(符号位为0)的原码=反码=补码. 2.负数(符号位为1)由原码到补码:原码符号位1不变(即先求绝对值的原码,将符号位变为1),其余取反,得到反码,再加1,得到补码. 重点:补码的表示方式有8位2进制,16位,32位,64位,这与c语言关键字表示的数值范围有关系. 3.对一个整数的补码再求补码,等于该整数自身. 4.模的概念:略. 例子:时钟的计量范围为0到11,模为12.表示n位计算机计量范围为0到2^(n)-1,模为2^(n).        在以模为12的系统中,加8和减4效果都是

计算机基础知识_原码反码补码

一.原码,反码,补码 1.原码 比如一个二进制数字 最高位是0,(0代表正数) 0010 1000 那么原码就是0010 1000 反码: 0010 1000 补码: 0010 1000 都是一样的,这个二进制数字的10进制是40 所以是正数 正数的原反补都是一样的 2.反码 反码就是原码的取反,二进制的 0变为1 1变为0 ,看最高符号位是0 还是1,如果是1,则你要0变为1,1变为0, 3.补码: 负数的的是原码 取反 在加1 变成补码(二进制数) 正数的原码 加上负数的补码就等于是做减法运

原码, 反码, 补码 详解

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计

[转]原码, 反码, 补码 详解 很全

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计

关于原码, 反码, 补码的复习

原本大一时考试90+的组成原理,隔了太长时间没使用,概念也慢慢模糊了,由于最近考试的基础知识有可能用到,于是,在网上找些资料,整理成这个文章,方便以后某天回来看看,好记性真不如烂笔头. 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011.如