补码 左移与右移 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 (即计算机里是以补码形式进行存储负数)