zoukankan      html  css  js  c++  java
  • 补码 左移与右移 32位系统

    计算机中的-2就是11111110b,而数学上的-2没法在计算机中直接存储,所以就有个算法来计算应该怎么存储。就是正数的反码+1,因为这个数正好加上原来的正数=0(溢出部分不管)
     

    首先,你要理解,计算机里面没有负数的概念,所有数都是无符号数。但是逻辑上有负数,怎么办呢?让他计算正确就OK了,那么负数就成正数取反+1了

    你别太关心啥补码,反码的。容易搞晕。
    计算机里面。你关注哪个无符号数+2正好溢出,那么那个数就是-2,因为他+2=0

    所以别把数学上直接搬上来套,越搞越晕。
    反正我的理解就是计算机里面根本就不管你负数啥的,全是无符号数,只是为了让我们更加方便的处理数学问题,引入了符号位这些概念

     算算补码怎么来的吧。
    2=00000010b,然后取反11111101b+1=11111110b

    -2=0xFFFFFFFE,你不管算数右移多少次都是-1

    说了,计算机不管你有符号无符号的。计算结果的最高为是1,就会给你设置SF,至于你去不去看SF是你的事情; 

    ---------------------------------------------------------------------------------

    QQ:149955923

    如果你声明一个负数变量,计算机会将你这个变量变成2进制,然后取反+1

    计算机在底层微电子元件中没有设计负数的电路,所以用正数的补码来表示负数

    计算机中的-2就是11111110b,而数学上的-2没法在计算机中直接存储,所以就有个算法来计算应该怎么存储。就是正数的反码+1,因为这个数正好加上原来的正数=0(溢出部分不管)

    网友推荐的书:

    巨神之碑文(149955923)
    我推荐Intel汇编程序设计  讲的非常详细

    黑无止境(546515315)
    我推荐天书夜读,里面有C语言在内存中的贮存方式

    黑无止境(546515315)
    还有一本 深入理解计算机体系结构 这本书讲的是从C语言程序员的角度去看待操作系统的内存结构

    ---------------------------------------------------------------------------------------------------------

    转自:http://zhidao.baidu.com/question/51147577.html?fr=ala0

    问:二进制负数的补码的原理
    为什么要用补码的形式改更负数
    如何掌握它的用法?

    1、在计算机系统中,数值一律用补码来表示(存储)。
    主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补
    码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
    2、补码与原码的转换过程几乎是相同的。
    数值的补码表示也分两种情况:
    (1)正数的补码:与原码相同。
    例如,+9的补码是00001001。
    (2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
    例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码
    0000111按位取反为1111000;再加1,所以-7的补码是11111001。

    经以上整合,自己得结论如下:

    (1) -4 >> 1 结果是-2;

    (2) -4 >>2  结果是-1;

    计算过程如下:

    4的原码:0x0000 0004;==>除符号位0外,其他按位取反加1===>(符号位变为1),得:

    -4的补码是:0xFFFF FFFC;

    那么-4进行右移1位,得:0xFFFF FFFE;(这个再进行取反加一,即可得到它的整数值为-2);--一个负数的补码,再次进行求补码则可还原其原码;

    也可通过debug.exe来查看-4的补码是多少

    cmd==>debug

    ==>a命令

    ==>mov ax,-4

    ==>回车,再回车

    ==>t

    即可查看到ax=FFFC  (即计算机里是以补码形式进行存储负数)

  • 相关阅读:
    Miracast
    linux软中断与硬中断实现原理概述
    入门视频采集与处理(BT656简介)
    emms指令在MMX指令中的作用
    linux进程的地址空间,核心栈,用户栈,内核线程
    linux 线程的内核栈是独立的还是共享父进程的?
    进程内核栈、用户栈及 Linux 进程栈和线程栈的区别
    Gson JsonParser的使用
    封装JDBC事务操作,执行存储过程测试
    Oracle 存储过程,临时表,动态SQL测试
  • 原文地址:https://www.cnblogs.com/zhangyongjian/p/3658364.html
Copyright © 2011-2022 走看看