首页 > 其他分享 >计算机中的原码、补码、反码

计算机中的原码、补码、反码

时间:2023-08-19 15:24:31浏览次数:41  
标签:存储 反码 计算机 补码 128 原码

参考:深入理解计算机中的原码、补码、反码 - 知乎 (zhihu.com)

计算机底层存储数据时使用的是二进制数字,但是计算机在存储一个数字时并不是直接存储该数字对应的二进制数字,而是存储该数字对应二进制数字的补码。

  • 机器数:一个数在计算机的存储形式是二进制数,我们称这些二进制数为机器数,机器数是有符号,在计算机中用机器数的最高位存放符号位,0表示正数,1表示负数。
  • 机器数的真值:因为带有符号位,所以机器数的形式值不等于其真值,以机器数1000 0111为例,其真正表示的值为-7,而形式值为135。将带符号的机器数的真正表示的值称为机器数的真值。

 

正数的原码、反码、补码一致。

负数:反码在原码的基础上,符号位不变,其余各位取反。补码:反码基础上+1.

 

 

问题:为何使用原码、反码、补码

我们上面说过,原码、反码、补码的表示对于正数来说都是一样的,而对于负数来说,三种码的表示确是完全不同的,那大家是否会有个疑问:如果原码才是我们人类可以识别并用于直接计算的表示方式,那为什么还会有反码和补码?计算机直接存储原码不就完事了?

在解决这些问题前,我们先来了解计算机的底层概念,我们人脑可以很轻松的知道机器数的第一位是符号位,但对于计算机基础电路设计来说判别第一位是符号位是非常难和复杂的事情,为了让计算机底层设计更加简单,人们开始探索将符号位参与运算,并且采用只保留加法的方法,我们知道减去一个数,等于加上这个数的负数,即:1-1 = 1 + (-1) = 0,这样让计算机运算就更加简单了,并且也让符号位参与到运算中去。

 

注意:因为实际上是使用以前的-0的补码来表示-128,所以-128并没有原码和反码表示,只要补码是[1000 0000],其十进制数值就为-128。


因为补码能多存储一个-128,而且在计算机底层中存储的是补码,所以在计算机中一个8位的二进制数的存储范围是用补码表示的[-128,127],而不是用原码或反码表示的[-127,127]。这也可以解释为什么计算机中一个字节的取值范围是[-128,127]。

这样也能够回答我们开始提出的问题了,原码、反码、补码的使用,是人们为了让符号位能参与运算并让计算机底层运算更加简单而设计出来的数据存储表示方式。

 

参考2:

-128 在八位二进制下,并没有原码和反码,只有补码。

而且,在计算机中,也只有补码,并没有原码和反码。

使用补码的意义在于:【把减法转换为加法】。

从而能够简化计算机的硬件。

计算机的位数是固定的,这就为补码的应用,提供了条件。

在八位二进制下,因为有一位是符号位,原码和反码只能表示0到127,-0到-127,所以-128不能用原码或反码表示。

 

反码通常是用来由原码求补码或者由补码求原码的过渡码。

原码是计算机机器数中最简单的一种形式,数值位就是真值的绝对值

在计算机内,有符号数有3种表示法:原码、反码和补码

 

补码同余

 

好多知识啊,以后研究下

 

标签:存储,反码,计算机,补码,128,原码
From: https://www.cnblogs.com/bravesunforever/p/17642482.html

相关文章

  • 写一个函数将a的二进制(补码)统计出来有几个1 (3种方法)
    方法1:intcount_bit_one(unsignedinta){ intcount=0; while(a) { if(a%2==1) { count++; } a=a/2; } returncount;}intmain(){ inta=0; intb=0; scanf("%d",&a); b=count_bit_one(a); printf("count=%d\n",b); ......
  • 定点补码乘法器小记
    目录硬件模拟软件无脑乘Booth乘法器华莱士树优化的华莱士树参考链接:《计算机体系结构基础第三版》定点补码乘法器一生一芯学习讲义一生一芯视频号硬件模拟软件软件方式即类似我们手工计算,如计算1101*0101+00001101(乘数最低位1,结果加上被乘数。将乘数右移,被乘数左移)+0......
  • 原码,反码,补码
    原码:它在计算机中的二进制数反码:正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。符号位表示这个数字是正数还是负数补码正数的补码就是它本身,负数就是符号位不变,其余的全部取反再加一。lowbit函数方法1:x&(x^(x-1))方法2:x&-x作用:找到二......
  • 2-9 在求对二的补码时,表达式 x &= (x – 1)可以删除 x 中最右边值为 1 的 一个二进制
    ArchlinuxGCC13.1.1 202304292023-07-2910:29:56星期六 点击查看代码#include<stdio.h>#include<stdint.h>intbitcount(uint8_tx){intcount=0;while(x!=0){x&=x-1;count++;}returncount;......
  • 原码反码补码
    原码为什么要用原码?计算机的存储是以二进制为基础的,因此正负号难以表示,所以,在二进制表示的基础上,选取最高位作为符号位;原码带来了什么问题? 1.出现了+0(00000000)和-0(10000000),明显不符合常理 2.关于负数和正数的计算是完全错误的,例如:-3(10000011)+1(00......
  • Verilog - 补码
    参考《计算机组成与设计第五版》1.二进制补码计算以64bit二进制补码为例。计算方法是:符号位乘以-2^63,然后其余位分别乘以他们各自基值的正值。如下图所示:对二进制补码求相反数将每bit数据从0转为1或从1转为0,然后对结果加1.正数二进制补码左边实际上是无限个......
  • [ARM汇编]计算机原理与数制基础—1.1.3 二进制补码
    在计算机中,为了表示有符号整数(即正数和负数),通常采用二进制补码表示法。二进制补码不仅可以表示负数,还能简化计算机的加法和减法运算。接下来,我们将介绍二进制补码的概念及其计算方法。原码、反码和补码在讨论补码之前,我们先了解一下原码和反码的概念。原码:直接将一个有符号整......
  • 二进制下的补码、反码、原码——适用于有符号整数
    简单定义简单起见,我们这里只考虑三位二进制数所能表示的范围,即${-4,-3,-2,-1,0,\1,\2,\3}$。机器数和真值一个数在计算机中的二进制表现形式,就是这个数的机器数(相当于数的原码)。例如,$-3$的机器数即为$111$,$2$的机器数为$010$。机器数在考虑最高位为符号位的情况下......
  • 原码,补码,反码
    在计算机系统中,数值都是用补码来存储的。主要原因是:使用补码,可以将符号位和其它位统一处理,同时,减法也可以按照加法来处理,如果最高位有进位,则进位被舍弃。以一个字节为例正数的补码和反码都跟原码是相同的。对于负数则不同,负数的反码是将原码除符号位以外的各位取反,而负数的补码则是......
  • 计算机基础中什么是原码,反码,补码和移码?各自有什么用途?
    在计算机基础中,原码、反码、补码和移码是用于表示和处理有符号整数的编码方式。它们各自具有不同的定义和用途。在本文中,我将详细解释每种编码方式,并提供实际例子以加深理解。原码(Sign-MagnitudeRepresentation):原码是最简单的整数表示方法,直接使用二进制表示数值,并用最高位表......