负数_负数的加减法怎么算 - CSDN
  • ---------------------------------------- author:hjjdebug date: 2017年 11月 14日 星期二 09:47:13 ...我要用最通俗的语言,解释清楚计算机中的正数,负数和补码的概念! 1. 计算机的算术,逻辑运算单元(cpu)是不区分正
    ----------------------------------------
    author:hjjdebug
    date: 2017年 11月 14日 星期二 09:47:13 CST
    ----------------------------------------
    我要用最通俗的语言,解释清楚计算机中的正数,负数和补码的概念!

    1. 计算机的算术,逻辑运算单元(cpu)是不区分正数,负数的, 它仅仅知道那是一堆二进制,
    对于算术指令,(加法器,减法器),
    逻辑指令(左移,逻辑右移,算术右移)
    这些运算在底层位级别的实现都是相同的,
    可以设想一下,一个8bit的加法器,依次加1的情景, 它不管是正数还是负数,只管一直向上累加.

    2. 计算机的正数,负数是怎么回事呢?
    是的,这一堆数据,全看你的解释,
    你可以把它解释成一个有符号数,但要按有符号数编码规则.
    也可以解释成一个无符号数,但要按无符号数编码规则.
    甚至,你可以把它解释成单精度浮点数(按照单精度的解释规则),
    多精度浮点数(按照多精度的对应的规则) 扯得就有点远了,不在本讨论范围.

    那么,这些规则是什么呢?
    无符号数全部用来表示数据,8bit表示0-255.
    有符号数拿出最高bit作为符号位,为0是正数,为1是负数.
    正数很好理解,与无符号数的理解一致,
    负数的表示就要费点周折.
    考虑8bits 计算器,
    0-1 = -1
    0-1 = 256-1 = 255 =0xff
    -1=0xff -2=0xfe -3=0xfd -4=0xfc
    把-1用0xff表示,-4用0xfc表示,这就是计算机的补码表示法.
    原来补码表示就这么简单,也这么自然.我们也经常这么用.
    补码的概念就是到模还有多少距离. 或者说,它是减法器减下来的.

    那么遇到一个负数0xe8到底是负几呢? 很简单,用0x100-0xe8=0x18
    就是-24了. 就是说,这个数加上24就到了它的模256了.

    0x100-0xe8=0x18 这不是按无符号数计算的吗? 是啊,cpu(中央处理单元)是不区分正数,负数的.
    前面已经说过了!
    不过把它当正数还是负数,到是有一些标志位会置位,它们是按照有符号数,无符号数规则设计的.
    这就是cpu的运算标志寄存器! 这些标志,即给出了有符号数的运算解释,也给出了无符号数的运算解释
    是否溢出,是否为0,是否符号位置位等等.

    有人又总结了负数的补码表示法到底代表负几?
    最前面1代表负数, 后面的数据按位取反再加1,就是负数的值了.
    慢着!,为什么是按位取反再加1?
    考察后面7bits数据, 按位取反之后,与原来7bits相加,就是0xff了,再加1,就是0x100,就是说,
    它的含义是到模0x100还有多少距离, 这就是补码的概念吗.
    以上面为例,就正是0x100-0xe8.  计算出来的数据就是负数的值.

    所以补码就是"补"的意思,到模还有多少距离,不要再讲正数的补码是其本身了,正数不讲补码,负数才有补码!
    展开全文
  • 原码:比如12的原码(在八位机中)是,0000 1100,(-8)的原码是,1000 1000,其中首位是符号位,0代表正数,首位1代表的是负数。 反码:正数的反码就是它本身;负数的反码是保留符号位,其他位取反。(-8)的反码...

    计算机擅长做加法运算,对于减法运算也是以加法的形式存在。比如,12-8,计算机会表达成12+(-8),那么问题就来了,(-8)是如何标示的在计算机中?

    原码、反码和补码的概念

    首先要明白几个概念:
    原码:比如12的原码(在八位机中)是,0000 1100,(-8)的原码是,1000 1000,其中首位是符号位,0代表正数,首位1代表的是负数。

    反码:正数的反码就是它本身;负数的反码是保留符号位,其他位取反。(-8)的反码就是1111 0111。

    补码:补码就是在反码的基础上加1。(-8)的补码是,1111 1000.

    计算机为了计算容易便把(-8)以补码的方式存储,1111 1000.

    举例1:12+(-8)= 4;
    0000 1100 + 1111 1000 = 0000 0100 ,又符号位是0是正数,则正数的补码和原码一致,即4

    举例2: 4+(-8)= -4;
    0000 0100 + 1111 1000 = 1111 1100 ,又符号位是1是负数,则负数要转化为原码才是真正的数值。注意这里补码转原码的步骤是和原码转补码是一样的。即符号位不变,其余位取反然后加1.
    1111 1100的原码即 1000 0100 ,(-4).

    数据存储范围

    对于一个8位机,无符号数范围是 0~255;有符号数的范围是 -128~127。
    127,即 0111 1111;
    -128,即 1000 0000; 注意由于是有符号数,所以这里的127和-128均是以补码的形式存在。

    展开全文
  • 负数以正值的补码形式存储 -5在计算机中表示如下: 5的原码:00000000 00000000 00000000 00000101(int占4字节)  反码:11111111 11111111 11111111 11111010  补码:11111111 11111111 11111111 11111011...

    负数以正值的补码形式存储

    -5在计算机中表示如下:

    5的原码:00000000   00000000  00000000   00000101(int占4字节)

           反码:11111111   11111111   11111111   11111010

          补码:11111111    11111111   11111111   11111011(0xfffffffb)

    展开全文
  • C语言负数的移位运算

    2012-05-01 21:00:26
    负数左移,有可能变成正数,但负数右移,肯定还是负数。 用16进制的形式对数据进行赋值,这16进制的数代表的是补码。  i = 0xfffffff7; //0xfffffff7是补码,而不是原码,故i = -9  printf("%d %x\n", i, i...
    在c 中左移也就是所说的逻辑移位,右端补0,而右移是算数移位,左端补齐的是最高位的符号位。
    故负数左移,有可能变成正数,但负数右移,肯定还是负数。

    用16进制的形式对数据进行赋值,这16进制的数代表的是补码。
        i = 0xfffffff7; //0xfffffff7是补码,而不是原码,故i = -9
        printf("%d %x\n", i, i);
        i = -9;
        printf("%d %x\n", i, i);  //故两个printf输出结果相同

    /**********************************************************************
     * Compiler: GCC
     * Last Update:  Tue 01 May 2012 07:31:44 PM CST
     ************************************************************************/
    #include <stdio.h>
    
    int main(int argc, char **argv)
    {   
        int i = 0x8000000f; //这里的0x8000000f为int型数据的补码形式
        int j = i >> 3; //右移是算术移位,左端补齐的是符号位
        int k = i << 1; //左移是逻辑移位,右端补0
        printf("%d %x\n", i, i); 
        printf("%d %x\n", j, j); 
        printf("%d %x\n", k, k); 
    
        i = -9;
        printf("%d %x\n", i, i); 
        i = 0xfffffff7;
        j = i >> 3;
        k = i << 1;
        printf("%d %x\n", i, i); 
        printf("%d %x\n", j, j); 
        printf("%d %x\n", k, k); 
    
    
        return 0;
    }


    运行结果:

    -2147483633 8000000f

    -268435455 f0000001
    30 1e
    -9 fffffff7
    -9 fffffff7
    -2 fffffffe
    -18 ffffffee


    -9的8位补码表示是1111 0111,即0xf7,这里是int型,扩展成32位表示是0xfffffff7。也可以直接用32位的形式写出-9的补码形式。
    对于signed类型的扩展,看该数据的最高位,为1,则扩展的所有位都为1,为0,则扩展的位都为0,故0xf7扩展成32位是0xfffffff7。
    这里 -9 << 1 = -18。不能简单的从左移就相当于乘以2来理解,要从-9的补码是0xfffffff7f去考虑。
    展开全文
  • 在计算机系统中,数值一律用补码...(我们拿32位int型来讲,首位是符号位,0表示正数,1表示负数,后面31位用来表示数值) 1.正数的补码和原码相同。 2.负数的补码是对其原码逐位取反,但符号位除外;然后整个数加1。
    在计算机系统中,数值一律用补码来表示(存储)。 

    主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补 码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

    (我们拿32位int型来讲,首位是符号位,0表示正数,1表示负数,后面31位用来表示数值

    1.正数的补码和原码相同。

    2.负数的补码是对其原码逐位取反,但符号位除外;然后整个数加1。

     比如 -1这个数

     原码:1000 0000, 0000 0000, 0000 0000, 0000 0001

     取反:1111 1111, 1111 1111, 1111 1111, 1111 1110

     加1 :1111 1111, 1111 1111, 1111 1111, 1111 1111

     上面最后结果就是-1的补码


    ===============int取值范围=============

    -2^31 ~ 2^31-1

    为什么负数是 -2^31 而不是-2^31-1呢?

    因为规定了1000 0000, 0000 0000, 0000 0000, 0000 0000这个特殊的数(本来是-0的)为-2^31,所以负数就多一个

    参考 这里:http://blog.csdn.net/zabcd117/article/details/1687413

    展开全文
  • 负数的二进制

    2019-04-03 16:04:01
    负数的二进制转换, 其实, 容易, 容易理解。 https://jingyan.baidu.com/article/29697b9106eb52ab21de3c7a.html 方法/步骤 首先,来个-5, 实践出真知嘛。 把5转化为二进制字节形式。 得到101, ...
  • 1什么是原码、反码、补码? 分为:正数 和负数(包括正浮点数,和负浮点数) 规定最高位位符号位正数为0,负数为1(原因下文解释) ...反码: 正数的反码是本身,负数的反码是负数的原码0变为1,1变为0
  • 负数-补码

    2011-12-15 11:23:36
    今天看网络小说热血传奇之路,提到游戏里的沙巴克刷钱bug,说是当沙城...显然这21亿就是int的最大值2147483647了,而且涉及到负数的问题,想起以前关于负数补码的知识看过但没通透,今天把它弄明白。 看了些补码的知识
  • 简单的小练习,实现将一个指定列表中的数值进行转化,对于其中的非负数不作处理,对于负数需要转化为制定的数值,很简单就不多说了,下面是具体的实现: #!usr/bin/env python #encoding:utf-8 from __future__ ...
  • 负数的左移和右移

    2017-07-06 00:41:51
    负数的右移:需要保持数为负数,所以操作是对负数的二进制位左边补1。如果一直右移,最终会变成-1,即(-1)>>1是-1。 ② 负数的左移:和整数左移一样,在负数的二进制位右边补0,一个数在左移的过程中会有正有负...
  • java 中负数取模

    2017-10-07 22:04:17
    正数取模运算相信很多人都很熟练,但是有时候会涉及到负数的取模,比如说面试。今天就来看看负数参与的取模应该怎么整。 2%(-5)结果应该是什么呢? 5%(-2)结果又应该是什么呢? 结论一:正数取模负数的结果和正数...
  • 符号位1表示负数,0表示正数。 正数:无区别,正数 的原码= 反码 = 补码 重点讨论负数 若已知 负数 -8,则其 原码为:1000 1000,(1为符号位,为1代表负数,为0代表正数) 反码为:1111 0111,(符号位保持...
  • python负数的处理

    2020-07-09 11:30:09
    负数的补码: 负数&0xffffffff 负数补码转换为负数形式 : ~(a^0xFFFFFFFF) print bin(-3) //-0b11 print bin(-3 & 0xffffffff) //0b11111111111111111111111111111101 例题 面试题 17.01. 不用加号的加法...
  • 如何用一个函数就能实现将正数变成对应的负数,将负数变成对应的正数: int turn(int a) {  a = ~a + 1;//正数取反加一后,得到负数的补码,负数是以补码的形式存在内存中,补码转为原码是就是正数要转化后对应的...
  • 给无符号数赋予一个负数的结果等于这个负数加上无符号数的模。 //将-1先转换为无符号类型数,结果为2的32次方-1,再赋给a unsigned a=-1;//输出4294967295 这个跟在算术表达式中既有无符号数又有int负数时类似...
  • 一、负数向二进制和十六进制转换 负数neg=-45054,为int数据类型 方法一: 求负数十六进制的公式为:  负数十六进制 = hex ( 负数 &amp; 0xFF....FF ) (注意:几个F取决于数据类型的范围,如int数据...
  • 1.正数和负数的原码、反码和补码: 正数的原,反和补码一样 负数的反码:除符号位外,按位取反 负数的补码:反码+1 2.Python的负数存储: 在Python中,数字以补码的形式存储。 想要获取负数的补码形式: 将数字...
  • 最高位1为负数,0为正数。  负数在内存是以补码的方式存储的。二、负数的计算 计算方式:原码->反码->补码  例如:十进制-8  原码(负数符号位为1):10001000;  反码(符号位不变,数值位分别“按位取反...
  • java中负数表示

    2018-05-28 17:48:41
    学习过java的都知道,在java中,不是直观的表示负数,而是采用补码的形式表示负数。这是为了硬件操作的方便,把减法也转换成加法来运算。 那补码是怎样表示的呢?为了得到补码,我们引入了反码。对于正数来讲,它的...
  • 负数的位运算

    2015-03-25 21:13:57
    每次遇到负数的位运算问题都是当时记住了之后又忘记了,先写在博客上方便以后查询。 负数的运算是以补码形式进行的,如果运算结果首位为1,结果也需要求一次补码如何求补码正数的补码还是自身,负数的补码:首位的1...
1 2 3 4 5 ... 20
收藏数 389,498
精华内容 155,799
关键字:

负数