二进制数的原码补码和反码
- 格式:ppt
- 大小:94.50 KB
- 文档页数:30


c语言原码,反码和补码的转换方法篇一:在 C 语言中,原码、反码和补码都是用来表示数字的编码方式。
其中,原码是最常见的一种编码方式,它用二进制数的最高位来表示符号 (正码或负码),其余位表示数值。
反码是在原码的基础上将数值位的符号位翻转得到的编码方式,而补码则是在原码的基础上将数值位的符号位再加一位得到的编码方式。
下面是 C 语言中原码、反码和补码的转换方法:1. 原码转换为反码:- 取原码数字的个位数字,如果这个数字为 0 或 1,则直接将其转换为反码;- 如果这个数字为 2 或 3,则将其转换为反码后再加 1;- 其他的位按照原码的二进制位数依次判断符号,如果为负数,则将其转换为反码后再加 1。
例如,将数字 8 转换为反码,步骤如下:- 个位数字为 0,转换为反码后为 0;- 十位数字为 8,转换为反码后为 8;- 百位数字为 0,转换为反码后为 0;- 千位数字为 8,转换为反码后为 8;- 万位数字为 0,转换为反码后为 0;- 亿位数字为 8,转换为反码后为 8 + 1 = 9。
2. 反码转换为原码:- 取反码数字的所有位,包括符号位;- 将反码数字的最高位设置为 1,表示符号位为 1;- 其他的位按照反码的二进制位数依次将数字转换为二进制数,去掉符号位后得到原码。
例如,将数字 9 转换为原码,步骤如下:- 取反码,得到 1010;- 将反码数字的最高位设置为 1,得到 1011;- 将剩余的位按照反码的二进制位数依次转换为二进制数,得到 11001,去掉符号位后得到 8。
3. 补码转换为原码:- 取补码数字的所有位,包括符号位;- 将补码数字的最高位设置为 1,表示符号位为 1;- 其他的位按照补码的二进制位数依次将数字转换为二进制数,去掉符号位后得到原码。
例如,将数字 10 转换为原码,步骤如下:- 取补码,得到 11001;- 将补码数字的最高位设置为 1,得到 1101;- 将剩余的位按照补码的二进制位数依次转换为二进制数,得到 10000,去掉符号位后得到 8。
3、带符号的⼆进制数(原码、反码、补码)1、数值的符号之前所提到的⼆进制数,没有考虑到符号问题,所指的都是⽆符号数。
但实际上数字是有正、负符号的。
以数字6为例,按照习惯的数学表⽰⽅法,正数6⽤+6表⽰,⼆进制为+110;负数6⽤-6表⽰,⼆进制数为-110.但在数字系统中,符号“+”、“-”也要数字化,⼀般将所对应的⼆进制数最⾼位增加多⼀位⽤来设为符号位,⽤“0”表⽰“+”、⽤“1”表⽰“-”。
为了区分⼀个符号数的“+”、“-”符号数字化前后的两种表⽰⽅法,引⼊真值和机器数两个术语。
真值:在⼀个⼆进制数前⾯⽤“+”、“-”表⽰正、负数的这种⼆进制数叫做真值。
机器数:将“+”、“-”符号⽤⼆进制码“0”、“1”表⽰的⼆进制数叫做机器数。
数据最后存到计算机中就是⽤机器数来表⽰的如下:+6 -> +110 -> 0110-6 -> -110 -> 1110(⼗进制数) (真值)(机器数)在计算机中最⼩基本的计算单位是字节,1字节=8位⼆进制数,由此可见最后存放到计算机中的机器数是8位⼆进制数,不够补0,符号位占据了1⼀个位置,所以到了最后只有7位数可以使⽤。
在c语⾔中使⽤ unsigned 关键字可以定义⼀个⽆符号的变量,可将变量的存储范围变⼤。
机器数是由符号位+⼆进制数组成的,机器数实际上是个⼤概念,意指这种类型的数据能存进去计算机,机器数在计算机中⼜有三种不同的表⽰⽅法,分别是:原码、补码、反码。
下⾯逐个列举2、原码将⼆进制数的真值中的正符号⽤0表⽰,负数符号⽤1表⽰,叫做数原码形式,简称原码。
例如:⼗进制为9的数,它的真值形式和原码形式如下所⽰:+9 -> +0001001 -> 0 0001001-9 -> - 0001001 -> 1 0001001(⼗进制数) (真值)(原码)原码⽤8位数码表⽰,最⾼位为符号位。
原码的优点是易于辨认,因为它的数值部分就是该数的绝对值,⽽且与真值和⼗进制数的转换⼗分⽅便。
进制转换以及原码、反码、补码2进制,⽤两个阿拉伯数字:0、1;8进制,⽤⼋个阿拉伯数字:0、1、2、3、4、5、6、7;10进制,⽤⼗个阿拉伯数字:0、1、2、3、4、5、6、7、8、9;16进制,⽤⼗六个阿拉伯数字:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F(A是10)后缀:O表⽰⼋进制数 H表⽰⼗六进制 B表⽰⼆进制 D表⽰⼗进制数8进制是⽤3位⼆进制数来代替每⼀位⼋进制数16进制是⽤4位⼆进制数来代替每⼀位⼗六进制数1010进制数转换为⼏进制就除以⼏,直到除到商为0,则所有余数的倒序则为转换结果!22 -> 8 :把⼆进制数每三位⼀组,然后每三位的最⾼位为4,第⼆位为2,最低位为1((1100100)2=(001 100 100)2=(1 4 4)8)2 -> 10 :利⽤权值计算:0110 0100,转换为10进制为0 * 2 ^ 0 + 0 * 2 ^ 1 + 1 * 2 ^ 2 + 0 * 2 ^ 3 + 0 * 2 ^ 4 + 1 * 2 ^ 5 + 1 * 2 ^ 6 + 0 * 2 ^ 7 = 1002 -> 16 :把⼆进制数每四位⼀组,分别转换为⼗六进制(利⽤权值计算),每四位的最⾼位为8,第⼆位为4,第三位为2,最低位为1 11101101转换⽅法:结果为ED⾼位:1110=1x8 + 1x4 + 1x2 + 0x1=(14)⼗进制=(E)⼗六进制,8为2的三次⽅权值,4为2的⼆次⽅权值低位:1101=1x8 + 1x4 + 0x2 + 1x1=(13)⼗进制=(D)⼗六进制,88 -> 2 :每位⼋进制数⽤3位⼆进制数表⽰(37.416)8 =>011 111 .100 001 110 =>(11111.10000111)2 然后每三位的最⾼位为4,第⼆位为2,最低位为18 -> 10 :利⽤权值计算:⼋进制数第0位的权值为8的0次⽅,第1位权值为8的1次⽅,第2位权值为8的2次⽅...将⼋进制数12.6转换成⼗进制数(12.6)8 = 1×8^1 + 2×8^0 + 6×8^-1 = (10.75)108 -> 16 :先将⼋进制化为⼆进制,再将⼆进制化为⼗六进制⼋进制数256 转换为16进制数=(三位⼀组) 010, 101, 110 =(四位⼀组) 0, 1010, 1110 = 0AE = AE1616 -> 2 :⼀位⼗六进制对应四位⼆进制数,每四位的最⾼位为8,第⼆位为4,第三位为2,最低位为1⼗六进制数3FC3H转换为相应的⼆进制数: 将3FC3H从低位开始转换3 --- 0011C --- 1100F --- 11113 --- 0011将对应的⼆进制数按顺序排好,转换成⼆进制数的结果是0011 1111 1100 0011, 即1111111100001116 -> 8 :先转为⼆进制再转为⼋进制⼗六进制16AH转化为⼋进制数:(16A)H =(0001 0110 1010)B = (101 101 010)B = (552)这个是⼋进制16 -> 10 :16进制数第0位的权值为16的0次⽅,第1位权值为16的1次⽅,第2位权值为16的2次⽅……7E8FF*16^0+8*16^1+E*16^2+7*16^3=323992816101010进制的⼩数转换为其他进制数的情况:整数位:10进制数转换为⼏进制就除以⼏,直到除到商为0,则所有余数的倒序则为转换结果!⼩数位:10进制数转换为⼏进制就乘以⼏,直到乘到为整数,则所有整数位的正序则为转换结果!(0.3125*8=2.5 整数位为2 0.5*8=4 整数位为4 则⼩数位的结果为24)1原码表⽰法是机器数的⼀种简单的表⽰法。
⼆进制数的四种表⽰形式---------以下内容为上⾯博客的学习笔记---------计算机中的⼆进制数有四种主要表⽰形式,那就是原码、反码、补码和移码,其中最重要的是前三种。
1. 原码对于⼈脑来说,我们都知道,+表⽰正数,-表⽰负数,然⽽在计算机⼆进制中也引⼊这两个符号肯定是不⾏的,因为在计算机中只有0和1这两个字,根本不认识“+”和“-”这两个符号。
计算机中的任何⾏为都依赖于它的物理结构。
计算机是没有思维的,所以得让计算机在0和1之间识别出对应数的正与负。
最开始的时候,⼈们约定在⼀个⼆进制数前⽤第⼀位(最⾼位)来表⽰符号,即1表⽰负,0表⽰正,这就是最初“原码”的概念。
“原码”就是“原始码位”,或者“原始编码”的意思,就是对应⼆进制数本⾝所代表的形式。
⽐如,+3(以8位字长为例,下同),符号位为0,3转化为⼆进制就是11,那么+3的原码就是00000011(最⾼位为符号位,正数的符号位为“0”,其余数值位不⾜部分补0)。
同理, -3的符号位为1,3转化为⼆进制就是11,最终-3的原码就是10000011(不⾜8位时在前⾯⽤0补⾜)。
在⽇常的书写中,原码的表⽰形式是⽤⽅括号下⾯加上⼀个“原”字下标来区别的,如[+3] 原= 00000011,[-3]原= 10000011。
再来计算+127和-127各⾃的原码。
+127中符号位为“0”,127的⼆进制为“1111111”,这样[+127]原=01111111;⽽-127中的符号位也为“1”,所以最终[-127]原=11111111。
最应该注意的是,在原码表⽰形式中,0有“+0”和“-0”之分。
对应的原码分别是0 0000000和1 0000000。
2.补码原码的设计很不错,⾄少可以成功地区分出⼆进制数的正与负了,但是这种⽅法仍有⼀些局限性,那就是原码在加、减法运算中不⽅便,符号位需要单独处理、单独判断。
同为正数的加、减是没什么问题的,可是异号相加、减时就存在问题了。