精华内容
下载资源
问答
  • 原码反码补码

    2018-10-08 11:27:00
    原码反码补码 (1)原码表示法原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。设有一数为x,则原码表示可记作〔x〕原。例如,X1= +1010110X2= 一1001010其...

    原码反码补码

    (1)原码表示法

    原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。设有一数为x,则原码表示可记作〔x〕原。

    例如,X1= +1010110

    X2= 一1001010

    其原码记作:

    〔X1〕原=[+1010110]原=01010110

    〔X2〕原=[-1001010]原=11001010

    原码表示数的范围与二进制位数有关。当用8位二进制来表示小数原码时,其表示范围:

    最大值为0.1111111,其真值约为(0.99)10

    最小值为1.1111111,其真值约为(一0.99)10

    当用8位二进制来表示整数原码时,其表示范围:

    最大值为01111111,其真值为(127)10

    最小值为11111111,其真值为(-127)10

    在原码表示法中,对0有两种表示形式:

    〔+0〕原=00000000

    [-0] 原=10000000

    (2)补码表示法

    机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,则X的补码表示记作〔X〕补。

    例如,[X1]=+1010110

    [X2]= 一1001010

    [X1]原=01010110

    [X1]补=01010110

    即 [X1]原=[X1]补=01010110

    [X2] 原= 11001010

    [X2] 补=10110101+1=10110110

    补码表示数的范围与二进制位数有关。当采用8位二进制表示时,小数补码的表示范围:

    最大为0.1111111,其真值为(0.99)10

    最小为1.0000000,其真值为(一1)10

    采用8位二进制表示时,整数补码的表示范围:

    最大为01111111,其真值为(127)10

    最小为10000000,其真值为(一128)10

    在补码表示法中,0只有一种表示形式:

    [+0]补=00000000

    [+0]补=11111111+1=00000000(由于受设备字长的限制,最后的进位丢失)

    所以有[+0]补=[+0]补=00000000

    (3)反码表示法

    机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。设有一数X,则X的反码表示记作〔X〕反。

    例如:X1= +1010110

    X2= 一1001010

    〔X1〕原=01010110

    [X1]反=〔X1〕原=01010110

    [X2]原=11001010

    [X2]反=10110101

    反码通常作为求补过程的中间形式,即在一个负数的反码的未位上加1,就得到了该负数的补码。

    例1. 已知[X]原=10011010,求[X]补。

    分析如下:

    由[X]原求[X]补的原则是:若机器数为正数,则[X]原=[X]补;若机器数为负数,则该机器数的补码可对它的原码(符号位除外)所有位求反,再在未位加1而得到。现给定的机器数为负数,故有[X]补=[X]原十1,即

    [X]原=10011010

    [X]反=11100101

    十) 1

    [X]补=11100110

    例2. 已知[X]补=11100110,求〔X〕原。

    分析如下:

    对于机器数为正数,则〔X〕原=〔X〕补

    对于机器数为负数,则有〔X〕原=〔〔X〕补〕补

    现给定的为负数,故有:

    〔X〕补=11100110

    〔〔X〕补〕反=10011001

    十) 1

    〔〔X〕补〕补=10011010=〔X〕原

    或者说:

    数在计算机中是以二进制形式表示的。
    数分为有符号数和无符号数。
    原码、反码、补码都是有符号定点数的表示方法。
    一个有符号定点数的最高位为符号位,0是正,1是副。

    以下都以8位整数为例,

    原码就是这个数本身的二进制形式。
    例如
    0000001 就是+1
    1000001 就是-1

    正数的反码和补码都是和原码相同。

    负数的反码是将其原码除符号位之外的各位求反
    [-3]反=[10000011]反=11111100
    负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。
    [-3]补=[10000011]补=11111101
    一个数和它的补码是可逆的。

    为什么要设立补码呢?

    第一是为了能让计算机执行减法:
    [a-b]补=a补+(-b)补

    第二个原因是为了统一正0和负0
    正零:00000000
    负零:10000000
    这两个数其实都是0,但他们的原码却有不同的表示。
    但是他们的补码是一样的,都是00000000
    特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)
    [10000000]补
    =[10000000]反+1
    =11111111+1
    =(1)00000000
    =00000000(最高位溢出了,符号位变成了0)

    转载于:https://www.cnblogs.com/0518liu/p/9753350.html

    展开全文
  • 原码 反码 补码

    千次阅读 2019-07-21 17:23:59
    原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制 [+1]原 = 0000 0001 [-1]原 = 1000 0001 第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是: [1111 ...

    原码

    原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制

    [+1]原 = 0000 0001
    
    [-1]原 = 1000 0001
    

    第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:

    [1111 1111 , 0111 1111]
    

    [-127 , 127]
    

    反码

    反码的表示方法是:

    正数的反码是其本身

    负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

    [+1] = [00000001]原 = [00000001]反
    
    [-1] = [10000001]原 = [11111110]反
    

    可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.

    补码

    补码的表示方法是:

    正数的补码就是其本身

    负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

    [+1] = [00000001]原 = [00000001]反 = [00000001]补
    
    [-1] = [10000001]原 = [11111110]反 = [11111111]补
    

    对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.

    展开全文
  • 原码反码补码的详析 及 移位 文章目录原码反码补码的详析 及 移位一、原码反码补码的定义与 表现... 32位int的表示范围 [-2147483648, 2147483647]三、[反码的数学理论深入][2]3.1取模同余3.2反码的同余...

    原码、反码和补码的详析 及 移位

    一、原码、反码和补码的定义与 表现形式

    原码反码与补码是机器存储一个数字的具体编码方式。

    1.原码

    第一位是符号位,其余位表示 数值的绝对值。

    对于1Byte 来说:

    +1 的原码:0000 0001,  0x01
    -1 的原码:1000 0001,  0x81
    

    第一位是符号位,1代表负数,0代表正数。

    1Byte所能表示的整数范围为: [1111 1111, 0111 1111],即 [-127, 127]。

    2.反码

    对于正数,其反码=原码

    对于负数,其反码=除符号位外的原码位取反。

    +1 的反码:0000 0001,  0x01
    -1 的反码:1111 1110,  0xFE
    

    3.补码

    对于正数,其补码=原码

    对于负数,其补码= 反码+1

    +1 的补码:0000 0001,  0x01
    -1 的补码:1111 1111,  0xFF
    

    4.用表格总结,便于记忆!!

    数值(真值) 原码 机器数 反码机器数 补码机器数
    正数 第一位0,其余为数值绝对值 原码 原码
    负数 第一位1,其余为数值绝对值 原码除符号位取反 反码+1
    举例:- 1 0000 0001 0000 0001 0000 0001
    举例:-1 1000 0001 1111 1110 1111 1111

    二、为何使用原码、补码和反码

    原码对于人来说,非常直观,通过第一位判断正负后,通过其他位来计算绝对值。但是对于机器来说,将第一位和其他位区分开来,在程序设计和电路设计上会非常复杂。能否将符号位统一进计算方式中呢?

    实际上,机器计算,只有加法而没有减法,因为减去一个数等于加上该数的负数。

    所以,能否将符号位参与进位运算,且只保留加法运算呢?

    1.原码的加法

    十进制:1 + (-1) = 0

    二进制:0000 0001[原] + 1000 0001[原] = 1000 0010[原] = -2

    让符号位参与运算后,发现原码的计算结果有问题!与十进制的计算方式不对应。

    为了解决这个问题,来看看反码的加法。

    2.反码的加法(循环进位)

    反码的运算规则:

    1. 反码运算时,其符号位与数值一起参加运算。

    2. 反码的符号位相加后,如果有进位出现,则要把它送回到最低位去相加(循环进位)

    3. 用反码运算,其运算结果亦为反码。在转换为真值时,若符号位为0,数位不变;若符号位为1,应将结果求反才是其真值。(这里求反不包括符号位)

    十进制:1 + (-1) = 0

    二进制:0000 0001[反] + 1111 1110[反] = 1111 1111[反] = 1000 0000[原] = -0

    数值是对了,但是是 -0 ,0的话,原则上是没有正负区分的,0加上符号之后也没有什么意义。

    除此之外,两种编码 0000 0001[原] + 1000 0000[原] 都表示了0,造成了浪费。

    十进制:-1 + (-127) = -128, -128超出了原码(反码)的表达范围,溢出变为126,不对

    二进制:1111 1110[反] + 1000 0000[反] = 0111 1111[反] = 0111 1111[原] = 127

    3.补码的加法(舍弃进位)

    补码的运算规则:

    两个机器数相加的补码可以先通过分别对两个机器数求补码,然后再相加得到,在采用补码形式表示时,进行加法运算可以把符号位和数值位一起进行运算(若符号位有进位,导致了溢出,则直接舍弃,注意这里和反码加法计算的区别),结果为两数之和的补码形式。

    补码的出现,解决了0的多编码问题。

    十进制:1 + (-1) = 0

    二进制:0000 0001[补] + 1111 1111[补] = 0000 0000[补] = 0000 0000[原] = 0

    那多出来的 1000 0000[补] 来表示谁呢?答案是 -128

    -127 的 原码、反码和补码分别是:1111 1111[原] 1000 0000[反] 1000 0001[补]

    十进制:-1 + (-127) = -128

    二进制:1111 1111[补] + 1000 0001[补] = 1000 0000[补]

    在这里,用1000 0000[补]来表示-128 的补码,虽然按照前一节的定义, 1000 0000[补] 对应的原码是 0000 0000[原],但这里不这么对应。所以,-128 只有补码,没有原码和反码。

    考虑符号位时,原码的表示范围为[-127, 127], 采用补码后,将 -0 变为表示 -128,这样补码的表示范围就是 [-128, 127],多保存了一个最小值。

    4. 32位int的表示范围 [-2147483648, 2147483647]

    对于具有32bit位的int,

    其最小值为:-2147483648 = -2^31,其补码为 0x8000 0000

    其最大值为:-2147483647=2^31-1,其补码为 0x7FFF FFFF

    对-2147483648取负值时,按理论应该是2147483648,但超过int能表达的最大正值,相当于2147283647+1=0111…1111+0000…0001=1000…0000=-2147483648(按补码理解)。也就是说对-2147483648取负仍然是-2147483648。

    对-2147483648-1时,相当于1000…0000+1111…1111(-1的补码)=0111…1111(溢出后)=2147483647(int的最大正值)

    三、反码的数学理论深入

    3.1取模同余

    以时针钟表为例,时间是12进制,如果当前是5点,希望设置为2点,该怎么调整钟表,下面有两种方法:

    1. 时针往回拨3小时,5-3=2
    2. 时针往前拨9小时,5+9=14, 14 mod 12=2

    mod 指的是取模操作,14针对12的余数是2。

    可以看到时针往回拨的减法操作可以用往前拨的加法操作替代。

    同余的概念:

    两个整数a, b,若他们除以整数m的余数相同,则成它俩对于模 m 同余。

    对于时钟,3mod12=3, 15mod12=3。 3和15对于模12同余。

    正数取余概念很容易,那么负数怎么取模呢?

    负数的取模:

    x mod y = x - y * floor( x / y )

    -3 mod 2 = -3 - 2 * floor(-3/2) = -3 - 2 * (-2) = -3 +4 = 1

    -5 mod 12 = -5 - 12 * floor(-5/12) = -5 - 12 * (-1) = 12- 5 = 7

    -3 mod 12 = -3 - 12 * floor(-3/12) = -3 - 12 * (-1) = 12 -3 = 9

    因此:减法转加法,相当于 找到 负数 的同余 正整数。

    对于时针问题,5-3=2, 5+9=14mod12=2

    -3 mod 12 = 9。 -3 和 9 是同余!

    3.2反码的同余

    下面看看反码和同余有什么关系。

    拿 2 - 1来看,反码符号位参与运算,符号位进位后,循环加到最末一位:

    2 - 1 = 2 + (-1) = [0000 0010]原 + [1000 0001]原 = [0000 0010]反 + [1111 1110]反 = [0000 0001]反 = 1

    反码的计算结果是正确的。

    在这里,关注的是 [0000 0010]反 + [1111 1110]反 ,因为正数的反码还是原码,如果在这里,将[1111 1110]反 除符号位之外的位看做是原码,则 -1 的反码表示的就是 126(除符号位)。

    恰恰,126 mod 127 = 126 -1 mod 127 = 126

    126 和 -1 同余,所以 2-1 和 2+126的余数是相同的。 都是正确结果1。

    所以一个数的反码,相当于对于一个模的同余数,该模就是二进制所能表示的最大值。

    像钟表一样,翻转一圈后找到正确的数值。

    3.3补码的意义所在

    既然反码已经实现了减法变加法,那补码的意义何在呢?上一节说了,利用补码,可以增加一个数的表达 -128,同时0的编码方式也只有一种。

    补码是反码加1。反码加1之后,为何还是可以得到正确的结果?

    再来看 2 -1 的情况:

    2 - 1 = 2 + (-1) = [0000 0010]原 + [1000 0001]原 = [0000 0010]反 + [1111 1110]反

    = [0000 0010]补 + [1111 1111]补 = [0000 0001]补 = 1

    在这里,如果把 -1 的 [1111 1111]补 看成是 原码(除符号位),则 表示 127。

    其实,补码就是在反码的基础上,增加了 模 的值。

    在反码中,模为127,在补码中模为128。

    用补码表示的运算结果最小值和最大值应该是[-128, 128],但是由于0的特殊情况, 没有办法表示128, 所以补码的取值范围是[-128, 127]。

    四、二进制运算

    与或异或

    与 & 或 | 异或 ^
    0&0=0 0|0=0 0^0=0
    0&1=0 0|1=1 0^1=1
    1&0=0 1|0=1 1^0=1
    1&1=1 1|1=1 1^1=0

    左移

    m<<n,表示把m左移n位。最左边的n位将被丢弃,右边补上n个0;

    00001010<<2 = 00101000

    10001010<<3 = 01010000

    右移

    m>>n,表示把m右移n位。右移的时候,右边的n位将被丢弃,左边补位的时候,要分情况。

    1. unsigned 无符号,补0
    2. signed,有符号,用符号位补。如果原来是正数,就补0,原来是负数,就补1.

    00001010>>2 = 00000010

    10001010>>3 = 11110001

    总结:

    左移时总是移位和补零;

    右移时无符号数是移位和补零,此时称为逻辑右移;

    而有符号数大多数情况下是移位和补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移。

    参考文章

    • https://www.cnblogs.com/huangjianwu/p/4549085.html
    • https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
    • https://blog.csdn.net/qq_41376345/article/details/80536654?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
    展开全文
  • 首先判断原码的正负,因为对于正数,其原码补码反码表示形式相同(符号位为0,数值部分与真值相同)。 对于反码补码,要区别:已知[x补],求[-x补]的题目(连同符号位各位取反,末位加一)。 原码:1001101 ...

    首先判断原码的正负,因为对于正数,其原码、补码反码表示形式相同(符号位为0,数值部分与真值相同)。

    对于反码和补码,要区别:已知[x补],求[-x补]的题目(连同符号位各位取反,末位加一)。

     

    原码:1001101

    反码:1,110010(除符号位以外,各位取反)

    补码:1,110011(除符号位以外,各位取反,末位加一)

    移码:0,110011(对补码符号位取反)

     

    浮点数:

    32位浮点数和64位浮点数的标准格式为

     贴一个之前做的题

    展开全文
  • 首先要明白,在计算机中,数以二进制的形式存在,其中有无符号数和有符号数 无符号数的,相当于十进制中的自然数,没有负数,因此八位无符号数的范围 00000000-11111111,...原码 反码 补码的概念 原码:就是符...
  • 最近复习c++,发现原码反码补码以及有符号数和无符号数的表示范围这方面的概念很模糊,现整理如下,供大家参考。 1、原码: 最高位表示数的符号,其他位表示数值 例如:[+7]原 = 0000 0111 [-7]原 = 1000 0111 2、...
  • 原码反码补码总说N+1位范围

    千次阅读 2021-03-13 11:03:30
    为什么原码反码补码总说N+1位,用这个前提去讨论它的范围呢?说说N位不是很好嘛? 原因分析: 后来才发现,其实是我自己太片面了,如果讨论N+1位字长。 第一:可以在公式里面用N表示出数值的范围,也比较方便 第...
  • 计算原码反码补码

    2017-03-30 16:27:13
    大学里面学了n多次原反补,每次都忘得巨干净,写下来是不是就不用找度娘了呢~本次举例默认用8位二进制表示,因为有溢出的问题,所以强调一下原码范围:-127~127反码范围:-127~127补码范围:-128~127注意: -128没有...
  • 讲的很清楚,吸收到的知识点: 机器使用补码,可以将...使用补码不仅仅修复了0的符号以及存在两个编码的问题,而且还能够多表示一个最低数,这就是为什么8位二进制使用原码反码表示范围为 [-127, +127],...
  • 范围仅在整数的数据表示里。 使用比喻,使用相似的思维就可理解其共性,这篇我就想这么写。 计算方法是设计出来的,方法因为什么要这样设计的思维和目的才是我们学习时的主线。 唐朔飞那本教材太高估我的智商,上来...
  • 关于左移和右移: 逻辑左移和算数右移结果...原码反码补码以char型为例,有符号(负数char)在计算机中的存储方式是补码形式:char x = -3; 则 x 的原码: 10000011 反码: 11111100 补码: 11111101 x表示x左移一
  • 原码反码补码详解在计算机中,为了方便计算(计算机中只有加法运算),所有数字都是用其补码表示的 原码、反码和补码详解:int类型的表示范围是 [-2^31, 2^31-1] 正整数,表示范围是 [1, 2^31-1] 正整数的原码 = ...
  • 表示范围:0 —— 2n-1 (即全0到全1) 有符号数 用机器字长第一位表示符号位,剩下的表示数值位,假设机器字长为8位(下同),可以表示为: +8:[x]原 = 0000 1000 -8:[x]原 =1000 1000 红色标识符号位,下同 ...
  • 原码 反码 补码 计算

    千次阅读 2013-02-01 16:50:00
    正数:正数的反码原码相同。 负数:负数的反码,符号位为“1”,数值部分按位取反。 例如: 符号位 数值位 ...特别规定:-128的补码为10000000,所以有符号字节的补码表示范围为:-128---127
  • 二进制中的原码反码补码 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1]原= 0000 0001 [-1]原= 1000 0001 第一位是符号位. 因为第一位是符号...
  • 反码: 正数:正数的反码原码相同。...(1)8位二进制原码表示范围:-127~+127 (2)8位二进制反码表示范围:-127~+127 (3)若字长为8位,则补码所表示的范围为-128~+127;进行补码运算
  • http://blog.csdn.net/LM165678/article/details/77030806 关于C中为何一个字节表示有符号数范围是[-128-127] -0的原码[1000 0000]即是-128的原码[1 1000 0000]被8位截断后的样子。凡是-0的,其表示的负数即是 ...
  • 即字长为1byte,原码表示数值的范围为(-127~-0 + 0~127)共256个。 举例: (00000001)原 + (10000001)原 = (10000010)原 = (-2) 显然不正确。 反码:解决了加减法问题,但新问题出现在+0和-0上,在人们的计算概念...
  • 以java中byte表示:2字节 8位,-128 首先首位1表示负数,128的正数为1000 0000(其实是-128),然后拼接为1 1000 0000,大于8位,则...就是-128 就是所谓的-0,但是这里表示的-128 因为-0 +0补码表示是一样的所以使用00
  • 可以表示范围就是0000 0000到1111 1111.那么1111 1111是多少呢?可以展开计算,但有些麻烦:1乘以2的7次方+1乘以2的6次方+。。。。+1乘以2的0次方。还有简单的方法:用1 0000 0000-1不就是八个1了吗?只需要用1...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 601
精华内容 240
关键字:

原码反码补码表示范围