QQ:797801
计算机中的-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 (即计算机里是以补码形式进行存储负数)
分享到:
相关推荐
C语言中的左移和右移是位操作的重要部分,它们可以高效地用于实现数据的快速乘除。本文将详细讲解左移与右移的概念、规则以及它们在有符号和无符号数上的不同表现。 首先,左移操作符“”在C语言中用于将一个数的...
位运算符包括与(&)、或(|)、异或(^)、取反(~)、左移()和右移(>>)。这些运算符在内存管理、数据处理、优化算法等方面都有广泛应用。 首先,我们来看“按位与”运算符(&)。它的特点是,只有当两个对应...
位运算符包括与(&)、或(|)、异或(^)、取反(~)、左移()和右移(>>)。 1. **按位与(&)运算符**: 按位与运算符(&)根据两个操作数的二进制位进行逐位比较,只有当对应的两个位都是1时,结果位才为1,...
1. **byte转int**:将一个byte转换为int,可以通过与0xFF进行按位与操作(AND),然后根据位移规则进行左移或右移操作。例如,`byte b = 10; int i = b & 0xFF;` 这里`b & 0xFF`操作的目的是保证只有低8位参与运算,...
这些运算符包括按位与(&),按位或(|),按位异或(^),按位取反(~),左移()和右移(>>)。它们在处理二进制数据时非常有用,特别是在计算机底层编程、硬件接口设计以及高效算法实现中。 1. **按位与(&)**: 按位与运算符...
例如,1100(二进制的12)左移一位变成10000(二进制的16),因为最左边的1被移出,右边补了三个0。 6. **右移运算符(>>)**: 右移运算符将一个数的所有位向右移动指定的位数。移动方式取决于是否是算术右移还是...
位运算符主要包括与(&)、或(|)、异或(^)、取反(~)、左移()和右移(>>). 这些运算符在计算机科学中有着广泛的应用,尤其是在硬件控制、数据编码、优化算法等方面。 1. **与运算符(&)**: 两个位都为1时,结果才为1。常...
本文将深入探讨C语言中的六种位运算符:与(&)、或(|)、异或(^)、取反(~)、左移()和右移(>>)。 1. **与(&)运算符**:两个操作数的对应位都为1时,结果位才为1,否则为0。常用于设置或清除特定位。 2....
尽管易语言的语法与传统汇编语言不同,但其仍然支持汇编级别的位操作,例如左移、右移、循环左移、循环右移、按位非等。这些操作在处理二进制数据和进行高效计算时尤为有用。 1. **左移(左移运算符:`)**: 左...
例如,-8(二进制为11111111111111111111111111111000,这是其补码表示)右移两位,结果仍然是-4(二进制为11111111111111111111111111110100)。 总结来说,C语言中的左移操作符()总是进行逻辑左移,即无论数值...
原码、补码和反码是三种常见的二进制表示法,主要用于表示有符号整数,而按位运算则是对二进制数进行操作的基础手段。下面将详细阐述这些概念。 一、原码(正码) 原码是最直观的二进制表示方法,直接反映了数字的...
例如,-5的八位二进制补码表示为11111011,因为-5的原码(不包括符号位)是0101,取反后变为1010,再加1得到1011,由于最高位为符号位,所以最终是11111011。 在汇编语言中,处理补码的操作通常涉及以下指令: 1. ...
在C++中编写补码运算的程序,我们通常会用到位运算符,如按位与(&),按位或(|),按位异或(^),左移()和右移(>>)等。比如,要实现两个有符号整数的加法,我们可以这样做: ```cpp int add(int a, int b) { while (b...
位运算符直接作用于二进制位,它们包括:左移(),右移(>>),无符号右移(>>>),按位与(&),按位或(|),按位异或(^),按位非(~)。这些运算符在处理位级逻辑和数值计算时非常有用。 二、左移操作符() ...
算术移位规则有三种:原码移位规则、补码右移规则和补码左移规则。原码移位规则是左移或右移时,符号位保持不变,最高有效位或最低有效位补0。补码右移规则是连同符号位一起右移,符号位保持不变。补码左移规则是...
- **去掉或添加二进制位**:通过右移、左移、按位或与按位与的组合使用,可以灵活地修改二进制序列中的特定位。 - **优化条件语句**:通过位运算可以简洁地实现条件分支逻辑,如不使用if语句进行变量值的切换。 - **...
位移法则是利用补码的性质,通过左移和右移来模拟除法过程,但这种方法对于硬件实现更为复杂。 浮点数在计算机中的表示通常遵循IEEE 754标准,它由三部分组成:符号位、指数部分和尾数部分。对于一个浮点数,其内码...
在算术移位中,符号位保持不变,左移和右移操作时,符号位不变,依次左移或右移,末位或最高有效位补 0。 在移位规则中,补码移位规则和原码移位规则是两种基本的移位规则。补码移位规则是指连同符号位一起,依次...
选择结果类型,如果选择循环移位,输入循环移位数值(正数右移,负数左移),针对 [a, b]区间内的每个数值n,先将十进制变成二进制,按照指定数值(正数右移,负数左移)循环移位,再将二进制结果转换成十进制,输出...
本资源主要讲解计算机组成原理中二进制乘法的相关知识点,包括原码一位乘法、补码一位乘法、移位操作、定点数一位乘法等。 一、移位操作 移位操作是计算机组成原理中的一种基本操作,它可以将二进制数的位数进行...