精华内容
下载资源
问答
  • 二进制正数的补码就是其本身
    千次阅读
    2020-09-14 17:09:50

    今天在学习C Primer Plus(第五版)中文版.pdf的时候遇到这么个问题,先上代码:

     

    #include <stdio.h>
    #define PAGES 336
    #define WORDS 65618
    int main(void)
    {
            short num = PAGES;
            short mnum = -PAGES;
    
            printf("num as short and unsigned short:%hd %hu\n",num,num);
            printf("-num as short and unsigned short:%hd %hu\n",mnum,mnum);
            printf("num as int and char:%d %c\n",num,num);
            printf("WORDS as int,short,and char:%d %hd %c\n",WORDS,WORDS,WORDS);return 0;
    }

     

    结果:

    num as short and unsigned short:336 336
    -num as short and unsigned short:-336 65200
    num as int and char:336 P
    WORDS as int,short,and char:65618 82 R

    请看我标红的部分,其实我蛮想不明白的,为什么-336的无符号整数是65200呢?书上说是2的补码(书中描述):数字0到32767代表它们本身,而数字32768到65535则代表负数,65535代表-1,65534代表-2,依次类推,因此-336由65536-336,也即65200来表示;本宝宝表示真心没看懂啥意思,然后就在网上各种找二进制的补码是啥意思,下面咱们就来看看什么是二进制的补码

    我试验的计算及环境假设是8位的,那接下来我就拿计算机是8位作基础来讲解:

    一、负数在计算机中如何表示

      之前我写了一篇博客,里面是计算c语言整数类型的取值范围的额,二进制中区分正负数的方法是看二进制的最高位是0还是1,1为负数,0为正数

      比如:127的二进制是01111111,而-127的二进制是 10000001(011111111 - 先取反,再加1 ->10000000+1 = 10000001),从这里可以看出127的最高位是0,而-127的最高位是1

    二、什么是二进制补码

      取一个数的二进制补码需要两步:

      1>.每个二进制位都取相反的值,也就是二进制位是1的,补码就是0,二进制位是0的,补码就是1

      2>.再把取反的二进制数转换成十进制,加上1,最后的结果就是这个数的补码的十进制数

      举例:取-127的二进制补码(8位机)

        二进制数:01111111

        补码:10000000

        结果:补码 10000000 + 1 = 10000001(129)

        也就是说-127在计算机(8位机)中10000001(写到这里,我突然有点明白C Primer Plus书中描述的啥意思:0-127代表它本身,128-255代表负数,那-127就等于256-127=129

      那可能很多人会说:为什么是这样啊?虽然知道怎么计算了,但是不知道为什么是这么计算的,那么接下来就来说说二进制补码的原理

    三、二进制补码的原理

      那大家都知道负数怎么来的,比如:A-B,那A比B小,结果就会是负数,这就有很多情况了,咱不讨论,就比如给你一个负数,那么最直接的你肯定会想到一个表达式了,比如给你个-127,那表达式就是0-127的来的,那我们把他转换成二进制来运算一下:

      预想结果:-127

      十进制表达式:0-127

      二进制表达式:00000000(0) - 01111111(127)

      以前小学数学当被减数大于减数的时候都要向上借一位来减的,那么接下来就是借位(

      重点:这里计算的时候二进制的位数是有规定的,比如-127,它是1111111 由7个1的二进制,那同学就用7个0的二进制去减,结果借一位变成了10000000(128)-1111111(127) = 1,然后在加1等于2,结果-127的补码就是00000010(2),这样可是错的,一定要遵守一个标准,那就是当前计算机是多少位的就借多少位加1位,那么比如-10是1010,就是00001010,借位就得在第9位上借,也就是100000000,结果就是246(11110110)

      借位进行运算:

        1>.100000000(256) - 01111111(127) = 10000001(129)

        2>.100000000(256) = 11111111(255) + 1;

          11111111(255) - 01111111(127) = 10000000(128)

          10000000(128) + 1 = 10000001(129)

      上面就是二进制补码的简单计算过程

    四、二进制补码有哪些好处呢?

      感觉不就是一个负数而已,非要搞的这么弯弯绕,我反正是晕了,那接下来就看下二进制补码的好处

      那我们之前说的判断最高位是1还是0来区分正负,那接下来我们就用两种表示法来计算作比较:

      举例:-10

      表达式:20 + (-10)

      1>.最高位区分正负:-10的二进制数为10001010

        二进制计算:00010100 + 10001010 = 10011110

        10011110转换成十进制是30,根据最高位区分正负,结果就是-30

      2>.再来看看二进制补码的方式进行计算:-10的二进制补码(11110101 + 1 = 11110110(246))

        二进制计算:00010100 + 11110110 = 100001010 

        而咱们刚才已经说了,假设计算机是8位的,那么这个结果超过8位,第九位会被舍弃,也就是00001010,结果就是10

    五、为什么正数加法适用于二进制补码呢?

      接下来我们求证一下X-Y(x + (-Y))这个表达式,相信大家就明白了(8位机)

      Y的二进制补码由上面的讲解大家都知道是:(11111111 - Y) + 1 ,所以也就是X加上Y的二进制补码,表达式可以写成如下格式:X + (11111111 - Y) + 1

      得到这个表达式就好办了,接下来我们分成两种情况来解释:

      1>.那就是X小于Y,那么结果肯定是个负数了,我们采用二进制的补码的逆运算,求出它对应的正绝对值,再在前面加一个负号就可以了

        第一步:计算Z、X、Y的二进制补码的表达式 Z = -((11111111 - Z) + 1);X = (11111111 - X) + 1;Y = (11111111 - Y) + 1;

        第二步:根据表达式X + (11111111 - Y) + 1来替换计算:-( ( ( 11111111 - X) + 1 ) - ( ( 11111111 - Y ) + 1 ) ) = -(11111111 - X + 1 - 11111111 + Y - 1) = -( -X + Y) = X - Y; 

      2>.X大于Y,那结果肯定是正数,那意味着Z肯定大于11111111,那根据8位机,第九位溢出了,就要舍去,表达式为(不太明白...):

        Z = Z - 100000000 = X + (11111111 - Y) + 1 - 100000000 = X - Y;

    更多相关内容
  • 二进制补码与小数

    千次阅读 2021-06-05 16:46:22
    牛逼的二进制 1.前言 计算机使用二进制来表示所有形式的数据:颜色、文字、图像等。当前辈们想方设法要造一台计算机时都会遇到一个问题:怎么...而补数就是正数表示负数,一个正数的补数就是它的负数,所以二进制数与它

    牛逼的二进制

    1.前言

    计算机使用二进制来表示所有形式的数据:颜色、文字、图像等。当前辈们想方设法要造一台计算机时都会遇到一个问题:怎么用电来表示数? 显然他们发现开关的开和关正好对应二进制的0和1,然后计算机就使用二进制直到如今。

    那计算机怎么使用二进制表示负数呢?怎么表示小数?怎么进行运算呢?

    2.用二进制表示负数

    由于二进制不能表示负数,所以必须使用正数来表示负数,将最高位当符号位使用,0正1负,这样就可以使用加法来进行减法运算。

    而补数就是用正数表示负数,一个正数的补数就是它的负数,所以二进制数与它的补数相加结果必为0。

    获得补数的方法是将二进制数取反加一。

    注意:运算结果是负数时,也是用补码来表示。将其返回到源码再在前面加负号就是运算结果。

    3.用二进制进行乘法和除法

    二进制进行乘除是使用移位运算,将二进制数总体进行左移或右移。

    • 左移:移动后空出来的最低位补0:
      在这里插入图片描述

    • 右移分为逻辑右移和算数右移,逻辑右移移动后空出来的最高位补0,例如霓虹灯;算术右移移动后空来的最高位补移位之前符号位的值。
      在这里插入图片描述
      此外,移位后最高位和最低位多出的数字直接丢弃。左移就是乘2的倍数,右移就是除以2的倍数。

    4.符号扩充

    以8位的二进制数为例,符号扩充指在保持值不变的前提下,使用16或32位来表示这个进制数,方法很简单,只需要用符号位的值填充最高位。
    在这里插入图片描述
    5.用二进制数表示小数

    先来看两个问题:

    1.将二进制数1011.0011转换成十进制:
    在这里插入图片描述
    2.小数点后四位的二进制可以表示的十进制有哪些:
    在这里插入图片描述
    由图可知二进制数是连续的,十进制不连续,中间的十进制数都无法用二进制表示。比如十进制的0.1转換成二进制是一个循环小数,计算机遇到这种循环小数时会根据数据类型进行截断或者四含五入。例如float会保存小数点后六位。这也是计算机进行小数运算时容易出错的原因,可以使用整数代替小数运算再复原的方法来解决这个问题。

    6.小数的存储方式:浮点数

    浮点数指用符号、位数、基数和指数来表示小数。由于计算机使用二进制,基数固定为2。
    在这里插入图片描述
    浮点数在内存上是这样存储的:
    在这里插入图片描述
    尾数部分使用正则表达式表示,指数部分使用“EXCESS”系统表示。

    1)正则表达式

    二进制数中使用的是将小数点前的值固定为1的正则表达式。就是将小数点左移或右移,使得左边有且只有一个1。由于第一位肯定是1,在内存上就可以不存,节省了一个数据位。

    2)“ EXCESS”系统

    因为指数部分也可能是负数,为了不使用符号位,前辈们创造出 “EXCESS”系统。通过将指数部分表示范围的中间值设为0,用正数表示负数。比如八位二进制最大值为255,即用127表示0,126就为-1,128为1。

    7.说明

    本文为《程序是怎样跑起来的》读书笔记,如有错误,请兄弟们指正,大家一起进步!

    展开全文
  • 二进制补码详解

    千次阅读 2022-03-27 10:29:49
    微处理器用二进制补码系统表示有符号整数,因为它可以将减法运算转换为对减数的补数的加法运算,详解如下。

        微处理器用二进制补码系统表示有符号整数,因为它可以将减法运算转换为对减数的补数的加法运算。

    1.什么是二进制补码运算

        我们先引入补数的概念:

    补数:一个数与它的补数之和是一个常数。例如一个一位的十进制数与它的补数之和总是9,2的补数是7,4的补数是5。在n位的二进制算术中,数P的补数Q=2^{n}-Q(即常数是2^{n})。 

        令n位二进制数N的二进制补码定义为2^{n}-N。如果N=5=00000101(8位二进制数),则N的补码为2^{8}-00000101=100000000-00000101=11111011(注意此处11111011用于表示5的补码,不要看成无符号整数)。

        下面看几个例子:

    5:00000101,5的补码:11111001   

    7:00000111,7的补码:11111001

        例1:将7与5的补数相加

    00000111 + 11111011 = 1000000010

        结果为9位二进制数100000010。由于一共只有8位,我们忽略最左边一位,结果为00000010,也就是2。即7与5的补数相加结果为2,效果等同于7-5=2。

        例2:将7的补数与5相加

    11111001+00000101=111111110

        结果为9位二进制数111111110,忽略最左边第九位后结果为11111110,“刚好”是二进制2的补码(2^{8}-00000010=11111110),也就是5-7=-2。

        从上述例子看,在二进制运算中,对于正数N而言,减去N的操作和加上N的补数的操作效果是相同的,也就是说-N等价于N的补数

        那么,为什么要引入补码运算呢? 

    2.用补数的加法代替减法   

        二进制补码算术不是魔术,具体展开看,在n位的二进制算术运算中,我们令Z=X-Y,我们试着用X加上Y的补数来运算,由于Y的补数为2^{n}-Y,所以

    X+Y的补数=X+(2^{n}-Y)=2^{n}+(X-Y)=2^{n}+Z

        换句话说,我们用X加上Y的补数会得到Z加上2^{n},但2^{n}只体现在最左边的第n+1位(如同上述例子中第九位的1),会被丢弃掉。所以此时我们得到了Z=X-Y=X+Y的补数,也就是说,在二进制补码运算中,减去一个数,等同于加上这个数的补码

        到这里,我们可以进一步直接放心地在二进制补码运算中用一个数的补码来表示这个数的负数了,如果不放心,我们还可以证明,对一个数进行两次求补将得到这个数本身:例如

    -5=2^{8}-00000101=11111011

    再次求补:-(-5)=2^{8}-11111011=00000101=5

        我们考虑加法的所有情况,请看下面的实例。令

    X=9=0000101, -X=11110111

    Y=6=00000110, -Y=11111010

        此时有

    X+Y=00000101+00000110=00000111=15

    X-Y=00001001+11111010=100000011=3(红色最高位舍弃)

    -X+Y=11110111+00000110=111111101=-3(3的补码)

     -X-Y=11110111+11111001=111110001=-15(15的补码)

        结合之前所有的论证, 上述所有4中加减法中的情况都正确得到了我们想要的结果,例如将6与9的补码相加完成运算-9+6,得到-3,确实是3的补码。

    3.求补运算

        我们现在可用补码加法来代替减法了,但是,例如N的补码是2^{n}-X,我们求补的操作本身不就是一次减法吗?!别急,补码运算可没这么蠢,求补的运算是非常简单的。我们将表达式2^{n}-X表示为下面的形式:

    2^{2}-X={\color{Blue} 2^{n}-1}-X+1={\color{Blue} {1000...0}-1}-X+1={\color{Blue} 111...1}-X+1

        例如,8位(n=8)时有

    2^{8}-X=100000000-X={\color{Blue} 100000000-1}-X+1 ={\color{Blue} 11111111}-X+1

        表达式111...1-X的值很容易计算。对于X的第i位n_{i},如果n_{i}=0,则1-0=1,同样,若n_{i}

    =1,则1-1=0,很显然,取n_{i} 的反就行了,换句话说计算111...1-X部分的值只需要将X每一位取反。可见计算X的补码非常容易:

    计算数N的补码,所要做的就是将X的每一位取反,然后将取反结果加1。

        例如,对于二进制的6=00000110,6的补码为11111001+1=11111010。

        这种补码运算相对于减法来说,非常适合用硬件实现,效率也很高。

    4.补码的特点

    1. 补码是一个真正的互补系统+X+(-X)=0;
    2. 补码0被表示为00...0,是唯一的;
    3. 补码的最高位为符号位,如果符号位为0,则该数为正;符号位为1,则该数为负;
    4. n位二进制补码数的表示范围为(-2^{n-1})~​(2^{n-1}​​​​​​-1),例如对于n=8,补码的范围为-128~127.共有2^{8}=256个不同的数(128个负数,1个0,127个正数);
    5. 补码加法和减法可以使用同样的硬件完成,因为补码减法由被减数加上减数的补数实现。

     5.运算溢出

         n位二进制补码数的表示范围为 (-2^{n-1})~​(2^{n-1}​​​​​​-1)。如果运算结果位于这个范围之外会发生什么呢?

        我们令5位有符号二进制补码数的表示范围为-16~+15,考虑下面的例子:

        情形1:5+7=00101+00111=01100=12

        情形2:12+13=01100+01101=11001=-7

        在情形1中,我们得到了期望的结果+12,但在情形2中,我们得到的结果是一个负数,因为它的符号位是1,如果将他视作无符号整数,它将是2^{4}+2^{3}+2^{0}=25,但是我们不可能将两种解释应用到一个表示方法中,所以一旦采用了补码表示,那么11001就只能表示-7。

        同样,如果两个负数相加且结果小于-16,也会超出5位二进制补码的表示范围。

        情形3:-9-12=10111+10111=101011

        在情形3中,第六位1舍弃后,结果为正数01011=11。

        这两个例子都说明了什么是运算溢出,它发生在补码加法当两个正数的和为负数,或两个负数的和为正数的时候。也就是说,如果操作数A和操作数B的符号位相同,但结果的符号位与它们不同的时候,则可以判定发生了溢出。

    展开全文
  • 今天一场技术笔试一道编程题难住了我,算出一个十进制数的二进制补码和对应的16进制,由于时间紧张,加上紧张,做的极差,因此mark以下

    十进制转二进制补码

    首先要明确的是:十进制直接转成二进制是转化为二进制原码,正数的原码和补码相同,但负数的原码按位取反末位加一才是补码。
    因此流程图大概如下:
    在这里插入图片描述

    整个代码我贴在最后

    主要逻辑代码:

    public static String convert(int num) {
    		StringBuilder resultString = new StringBuilder();
    		// 初始化补码数组,共12位
    		String[] complementStrings = new String[] { "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" };
    		boolean ifNegative = false;
    		if (num < 0) {
    			complementStrings[0] = "1";
    			num = -num;
    			ifNegative = true;
    		}
    		// 加入到补码的数组中,开头从12-strings.length开始
    		String[] strings = Integer.toString(num, 2).split("");
    		// 对应在strings数组中的下标
    		int j = 0;
    		for (int i = 12 - strings.length; i < 12; i++) {
    			complementStrings[i] = strings[j];
    			j++;
    		}
    		// 如果为负数,先全部取反,否则直接拼接
    		if (ifNegative) {
    			for (int i = 1; i < complementStrings.length; i++) {
    				if (complementStrings[i].equals("1")) {
    					complementStrings[i] = "0";
    				} else {
    					complementStrings[i] = "1";
    				}
    			}
    			// 送进函数加一
    			resultString.append(binaryPlusOne(complementStrings, 11, 1));
    		} else {
    			resultString.append(strings.toString());
    		}
    		return resultString.toString();
    	}
    
    

    重要代码1:末位加一

    为递归算法,递归逻辑为每次将一位执行与进位的加法并拼接,走完整个数组,返回。

    	/**
    	 * 
    	 * @param strings 二进制数数组
    	 * @param temp 对哪一位执行加法
    	 * @param carry 进位值
    	 */
    	private static String binaryPlusOne(String[] strings, int temp, int carry) {
    		if (temp < 0) {
    			StringBuilder tempBuilder = new StringBuilder();
    			for (int i = 0; i < strings.length; i++) {
    				tempBuilder.append(strings[i]);
    			}
    			return tempBuilder.toString();
    		} else {
    			// 计算加上进位后的值
    			int tempInt = Integer.parseInt(strings[temp]) + carry;
    			// 更新对应位置上的值
    			strings[temp] = String.valueOf(tempInt % 2);
    			// 更新进位
    			carry = (tempInt) / 2;
    			// 更新坐标
    			temp--;
    		}
    		return binaryPlusOne(strings, temp, carry);
    	}
    

    二进制转16进制

    同样也是递归的思想,每次将二进制字符串最后四位进行转化,并拼接,知道拼完为止。

    重要代码

    	/**
    	 * 将二进制转为16进制
    	 * 
    	 * @param binaryString
    	 * @param length
    	 * @return
    	 */
    	private static String binaryTo16(String binaryString, int length) {
    		if (length < 4) {
    			return binaryString;
    		}
    		return binaryTo16(binaryString.substring(0, length - 4), length - 4)
    				+ binaryTo16Map.get(binaryString.substring(length - 4, length));
    	}
    

    总体代码,粘了就能用

    输入为一个十进制数(其二进制位数在12位以内)
    输出为 12位二进制补码和二进制补码对应的16进制码的拼接(以分号隔开)

    示例:

    输入:-7
    输出:111111111001;FF9
    
    import java.util.HashMap;
    
    public class BinaryCodeTransfer {
    	public final static int totalNumber = 12;
    	public final static HashMap<String, String> binaryTo16Map = new HashMap<String, String>() {
    		{
    			put("0000", "0");
    			put("0001", "1");
    			put("0010", "2");
    			put("0011", "3");
    			put("0100", "4");
    			put("0101", "5");
    			put("0110", "6");
    			put("0111", "7");
    			put("1000", "8");
    			put("1001", "9");
    			put("1010", "A");
    			put("1011", "B");
    			put("1100", "C");
    			put("1101", "D");
    			put("1110", "E");
    			put("1111", "F");
    		}
    	};
    
    	public static void main(String[] args) {
    		System.out.println(convert(-7));
    	}
    
    	public static String convertToBase72(int num) {
    
    		return Integer.toString(num, 2);
    	}
    
    	public static String convert(int num) {
    		StringBuilder resultString = new StringBuilder();
    		// 初始化补码数组,共12位
    		String[] complementStrings = new String[] { "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" };
    		boolean ifNegative = false;
    		if (num < 0) {
    			complementStrings[0] = "1";
    			num = -num;
    			ifNegative = true;
    		}
    		// 加入到补码的数组中,开头从12-strings.length开始
    		String[] strings = Integer.toString(num, 2).split("");
    		// 对应在strings数组中的下标
    		int j = 0;
    		for (int i = 12 - strings.length; i < 12; i++) {
    			complementStrings[i] = strings[j];
    			j++;
    		}
    		// 如果为负数,先全部取反,否则直接拼接
    		if (ifNegative) {
    			for (int i = 1; i < complementStrings.length; i++) {
    				if (complementStrings[i].equals("1")) {
    					complementStrings[i] = "0";
    				} else {
    					complementStrings[i] = "1";
    				}
    			}
    			// 送进函数加一
    			resultString.append(binaryPlusOne(complementStrings, 11, 1));
    		} else {
    			resultString.append(strings.toString());
    		}
    
    		// 如果大于零直接求出十六进制,否则,放入16进制处理函数中
    		resultString.append(";").append(binaryTo16(resultString.toString(), 12));
    		return resultString.toString();
    	}
    
    	/**
    	 * 
    	 * @param strings
    	 * @param temp
    	 * @param carry
    	 */
    	private static String binaryPlusOne(String[] strings, int temp, int carry) {
    		if (temp < 0) {
    			StringBuilder tempBuilder = new StringBuilder();
    			for (int i = 0; i < strings.length; i++) {
    				tempBuilder.append(strings[i]);
    			}
    			return tempBuilder.toString();
    		} else {
    			// 计算加上进位后的值
    			int tempInt = Integer.parseInt(strings[temp]) + carry;
    			// 更新对应位置上的值
    			strings[temp] = String.valueOf(tempInt % 2);
    			// 更新进位
    			carry = (tempInt) / 2;
    			// 更新坐标
    			temp--;
    		}
    		return binaryPlusOne(strings, temp, carry);
    	}
    
    	/**
    	 * 将二进制转为16进制
    	 * 
    	 * @param binaryString
    	 * @param length
    	 * @return
    	 */
    	private static String binaryTo16(String binaryString, int length) {
    		if (length < 4) {
    			return binaryString;
    		}
    		return binaryTo16(binaryString.substring(0, length - 4), length - 4)
    				+ binaryTo16Map.get(binaryString.substring(length - 4, length));
    	}
    }
    
    
    展开全文
  • 针对补码这个常见的概念,引申到小数的补码,并且用实例说明运算规则。
  • 二进制补码运算

    千次阅读 多人点赞 2020-07-23 13:52:43
    二进制负数的在计算机中采用补码的方式表示。很多人很好奇为什么使用补码,直接使用原码表示多好,看上去更加直观和易于计算。然而事实告诉我们,这种直观只是我们人类的一厢情愿罢了,在计算机看来,补码才是它们最...
  • java基础 二进制补码

    2021-02-12 23:25:41
    二进制补码:1、计算机系统的...模:某种类型数据的总数,例如:4位二进制数的模是2^4=168位二进制数的模是2^8=256负数=模-正数,这就是逐位取反加1的原因。1、在计算机系统中,数值一律用二进制补码来存储。2、二...
  • 二进制补码减法公式推导

    千次阅读 2020-10-30 12:19:59
    二进制中 : 1. 位宽不变的情况下, 模 加1等于0. 模表示所有的位数都是1, 例如位宽是2, 模就是11. 模加1就是 11b + 01b = 100b ,但是位宽不变, 只取低二位, 所以就是0 2. 模 = A + A的反码 ( 以下用 ~A 表示) , ...
  • 二进制补码计算简单详实的讲解

    千次阅读 2021-03-23 21:54:04
    本文说明一个基本的问题,补码的问题。需要说明一点补码是对负整数在计算机中存储的一种形式;另一种形式是负数在计算机中可以用符号+负数绝对值的形式表示一个负数;比如(-3: 1000 0011存储)但是这种表示的负数有两...
  • 完整代码如下 number=int(input("Enter ...0000 0000 0000 0000 0000 0000 0000 0101 首先将十进制数转化为二进制数 以67为例 67%2:1 67//2 33%2:1 33//2 16%2:0 16//2 8%2:0 8//2 4%2:0 4//2 2%2:0 2//2 1%2:1 1//2
  • 原码:最高位为符号位。。...正数和负数相加的时候,结果不是我们所算出的结果(在计算机里面,只能做加法运算)1-1 = 1 + -11: 0000 0001-1:1000 0001加法:10000010 = -2反码:符号位不变,...
  • 转载:http://blog.xdnice.com/blog40543i59178.htmlmatlab提供了一个系统函数dec2bin,可以用来进行十进制数的二进制转换,不过功能有限!在matlab中键入 help dec2bin,如下:DEC2BIN Convert decimal integer to a ...
  • java二进制原码 补码与反码...对于一个正数来说,二进制原码,补码,反码都是一个,完全相同 int i = 1; 对应的二进制原码:00000000 00000000 00000000 00000001 对应的二进制反码:00000000 00000000 00000000 000000
  • 二进制原码、反码、补码

    千次阅读 2021-11-30 08:25:50
    文章目录1、有符号数和无符号数2、二进制的原码、反码、补码原码反码补码小结举个栗子:3、思考:java中为什么byte的取值范围是-128~1274、Java中的<< 和 >> 和 >>> 1、有符号数和无符号数 其实...
  • 计算机补码的加减法 因为减法可以转化为加法,所以只考虑加法的四种情况。 正 + 正:结果为正,有可能发生上溢,结果为负。 负 + 负:结果为负,有可能发生下溢,结果为正。 正 - 负:A-B = A+(-B)
  • 二进制原码和补码

    千次阅读 2018-11-26 11:03:29
    当原码为正数的时候,正数的原码反码补码都相同,即...现代计算机多数以二进制补码的形式来存放整数。简单的说,一个二进制数的每一位对应了一个权值,从最低为到最高位,权值依次是1、2、4、8、16……以此类推。...
  • 关于二进制补码补码加法的思考

    千次阅读 2021-09-06 19:56:13
    笔者刚学数字电路,就在二进制补码处踩了许多坑,下面就来写一下我对二进制补码的感悟。 提示:以下是本篇文章正文内容,下面案例可供参考 一、生活中了解补码 首先展示一下求补码的公式N(补)=R^n-N 这里的N是原码...
  • 二进制运算(正码、反码、补码)机器数(机器存储的数)​ 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1//比如byte类型是一个字节...
  • 二进制数的反码和补码

    千次阅读 2019-01-16 22:12:54
    在大学的学习中,一开始自认为已经学会了反码与补码,但在看到多种表述之后,...首先从最一般的意义上,分别说一下二进制的反码和补码: 1、反码 1’s complement 把所有的0变为1,所有的1变为0。 如: 10110010 B...
  • 二进制、16进制、补码

    千次阅读 2019-09-11 16:53:33
    二进制 ​ 逢2进1的计数规则 格式:编写时要加0b int 0b //输出2进制: Integer.toBinaryString(); System.out.println(Integer.toBinaryString(n)); //输出10进制: Integer.toString(); System.out....
  • 二进制原码和补码的转换

    千次阅读 2020-08-24 10:18:32
    1.概念理解(注意正数的反码和补码就是原码,负数的补码是反码加1) 正数:原码=反码=补码 正数举例(数字3):11(原码)=11(反码)=11(补码) 负数:原码取反=反码;反码+1=补码 负数举例(数字-3):111(原码)-...
  • 计算机中的负数:二进制补码

    千次阅读 2021-01-01 00:02:25
    一个二进制数中,最高位是符号位,0 为正数,1 为负数。 6 的二进制:0000 0110 8 的二进制:0000 1000 -8 的二进制:1000 1000 如计算: 6 + 8  00000110 +00001000 --------- ...
  • 什么是二进制二进制是计算技术中广泛使用的一中数制,是由0和1两个数码来表述的数,他的基数是2,进位规则是“逢二进一”。 一、二进制转换为十进制? 按权展开求和,该方法的具体步骤是先将二进制的数写成加权...
  • 二进制补码和十进制数的转换

    万次阅读 2020-04-03 23:24:58
    先考虑如何将二进制补码转换为十进制整数: 若符号位是0, 则该数是正数, 原码等同于补码. 可以由原码(也就是补码)得知代表的正整数. 若符号为是1, 则该数一定是负数, 可按照以下方式转换: 方式一: 先把符号位去掉, ...
  • 原码:一个整数按照绝对值的大小转化成二进制的数 反码:将二进制数按位取反 补码:反码加一 负数从真值求补码 先求出原码 求反码 反码加一 如求-20的补码 原码为00010100;反码为11101011;其补码为...
  • 二进制补码计算原理详解

    万次阅读 多人点赞 2018-07-03 17:34:54
    二进制负数的在计算机中采用补码的方式表示。很多人很好奇为什么使用补码,直接使用原码表示多好,看上去更加直观和易于计算。然而事实告诉我们,这种直观只是我们人类的一厢情愿罢了,在计算机看来,补码才是它们最...
  • 2,16进制原码补码反码问题

    千次阅读 2021-05-21 02:31:16
    1. 在计算机里,通常用数字后面紧跟一个英文字母来表示该数的数字,十进制一般用D,二进制用B,八进制用O,十六进用H来表示,2.首先,十进制数转换成二进制,除2取余,按箭头方向写,自上而下写出来,所以45D转换成...
  • 如果你现在还是不能够很熟练的转换二进制、十六进制、二进制补码,那么这篇博客也许对你有所帮助,每一个知识点都要坚实呀。 技巧解析一窥: 如果知道二进制补码、十六进制或十进制其中一个,需要转换出其它...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,369
精华内容 15,747
关键字:

二进制正数的补码就是其本身