c语言原码反码补码是什么,c语言中补码和反码是什么意思,求例子,谢谢
c语言原码反码补码是什么,c语言中补码和反码是什么意思,求例子,谢谢详细介绍
本文目录一览: C语言中的原、反、补码
int,
字长为2
字节共16位二进制数,
数的范围是-32768~32767
-32768的二进制是11111111
11111111负数最高位为1.
32767的二进制是01111111
11111111
正数最高位为0.
正数的原码和补码一样。
负数的补码是原码取反加1.
则
32768=01111111
11111111+1
=10000000
00000000
-32768=10000000
00000000
取反011111111
11111111
+1
10000000
00000000
结果和你书上看到的一样,说明书是对的,哈哈。
c语言中,所有的整型数据实际存储的都是补码。
要计算补码,先要知道原码的概念,原码也就是一个10进制数的二进制表达方式,比如100的原码为1100100。
补码的计算原则为:
1
对于无符号数以及有符号数中的正数,其补码就是原码本身;
2
对于有符号数中的负数,其补码为真值绝对值的反码加一,其中反码为原码按位取反。
针对负数举例说明:
-100在用char型(8位)表示时,其补码可以按照如下流程计算。
1、
100的原码为01100100
2、按位取反,得到反码为10011011
3、将反码加1,
即10011011+1
=
10011100。
于是-100的补码表示就是10011100,也就是0x9c(16进制)。
关于C语言的原码、反码、补码
正数 原码、反码、补码 一样。
负数,补码等于反码加1.
反码:不考虑符号位,按位取反(1-〉0,0-〉1).
补码 10000000
反码 = 补码 - 1 = 01111111
原码 = 不考虑符号位,按位取反 = 00000000
负数 补码=原码取反补1
-128在ascii码中代表0,
参考资料:
http://baike.baidu.com/view/377340.htm
+0 -0 都是0,没区别,都-128
您好,我这边是C语言的初学,我对原码 补码 反码非常不理解,基本属于
举个例子,一个数,你把它转换成二进制数,比如:+6=0110 -6=1110(第一位作为符号位,0为正,1为负)
原码:原码就是它本身:
0110(原码)=0110
1110(原码)=1110
反码:正数不变,负数除符号位,取反。
0110是正数,反码是它本身:0110(反码)=0110
1110是负数,除符号位取反:1110(反码)=1001
补码=反码+1:
0110(补码)=0110(反码)+1=0111
1110(补码)=1110(反码)+1=1001+1=1010
希望可以帮到你。
C语言中,什么是补码、源码、反码?分别怎样计算?
正数求补码的方法 正数码型不变
负数求补码的方法 按位取反加1
正数补码求真值 正数码型不变
负数补码求真值 按位取反加1
一、原码
求原码:X≥0,则符号位为0,其余照抄;
X≤0,则符号位为1,其余照抄。
【例1】X=+1001001 [X]原 = 01001001
【例2】X=-1001001 [X]原 = 11001001
二、反码
求反码:若X≥0,符号位为0,其余照抄;
若X≤0,符号位为1,其余按位取反。
【例3】X=+1001001 [X]反 = 01001001
【例4】X=-1001001 [X]反 = 10110110
三、补码
求补码:若X≥0,符号位为0,其余照抄;
若X≤0,符号位为1,其余取反后,最低位加1。
【例5】X=+1001001 [X]补 = 01001001
【例6】X=-1001001 [X]补 = 10110111
C语音的反码原码补码是怎么弄的,大神请系统具体的说一下
原码,将十进制数转换为二进制,符号位正数为0,负数为1。
反码,正数的反码等于原码,负数的反码将原码的符号位不变,各位取反。
补码,正数的补码等于原码,负数的补码将原码的符号位不变,各位取反,末位加1。
例:x=+122, y=-122, 求x,y的原码,反码,补码。
x=+122=+1111010=0 1111010,y=-122=-1111010=1 1111010
原码:x=0 1111010,y=1 1111010
反码:x=0 1111010,y=1 (1111010)取反=1 0000101
补码:x=0 1111010,y=1 (1111010)取反+1=1 0000101+1=1 0000110
C语言编程之二进制原码、反码和补码
概述
在计算机内,有符号数有3种表示法:原码、反码和补码。
在计算机中,数据是以补码的形式存储的,所以补码在c语言的教学中有比较重要的地位,而讲解补码必须涉及到原码、反码。
详细释义
所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
原码、反码和补码的表示方法
定点整数表示法
定点小数小时法
反码
正数:正数的反码与原码相同。
负数:负数的反码,符号位为“1”,数值部分按位取反。
例如: 符号位 数值位
[+7]反= 0 0000111 B
[-7]反= 1 1111000 B
注意:
a. 数0的反码也有两种形式,即
[+0]反=00000000B
[- 0]反=11111111B
b. 8位二进制反码的表示范围:-127~+127
原码
在数值前直接加一符号位的表示法。
例如: 符号位 数值位
[+7]原= 0 0000111 B
[-7]原= 1 0000111 B
注意:
数0的原码有两种形式:
[+0]原= 00000000B
[-0]原= 10000000B
位二进制原码的表示范围:-127~+127
补码
1)模的概念:把一个计量单位称之为模或模数。
例如,时钟是以12进制进行计数循环的,即以12为模。在时钟上,时针加上(正拨)12的整数位或减去(反拨)12的整数位,时针的位置不变。
对于一个模数为12的循环系统来说,加2和减10的效果是一样的;因此,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。
10和2对模12而言互为补数。
同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为8),因此它的运算也是一种模运算。当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,显然,8位二进制数,它的模数为2^8=256。在计算中,两个互补的数称为“补码”。
2)补码的表示:
正数:正数的补码和原码相同。
负数:负数的补码则是符号位为“1”。并且,这个“1”既是符号位,也是数值位。数值部分按位取反后再在末位(最低位)加1。也就是“反码+1”。
例如: 符号位 数值位
[+7]补= 0 0000111 B
[-7]补= 1 1111001 B
补码在微型机中是一种重要的编码形式,请注意:
a. 采用补码后,可以方便地将减法运算转化成加法运算,运算过程得到简化。
正数的补码即是它所表示的数的真值,而负数的补码的数值部份却不是它所表示的数的真值。
采用补码进行运算,所得结果仍为补码。
b. 与原码、反码不同,数值0的补码只有一个,即
[0]补=00000000B。
若字长为8位,则补码所表示的范围为-128~+127;进行补码运算时,应注意所得结果不应超过补码所能表示数的范围。
原码、反码和补码之间的转换
由于正数的原码、补码、反码表示方法均相同,不需转换。
在此,仅以负数情况分析。
(1) 已知原码,求补码。
例:已知某数X的原码为10110100B,试求X的补码和反码
解:由[X]原=10110100B知,X为负数。求其反码时,符号位不变,数值部分按位求反;求其补码时,再在其反码的末位加1。
1 0 1 1 0 1 0 0 原码
1 1 0 0 1 0 1 1 反码,符号位不变,数值位取反
1 1 0 0 1 1 0 0 补码,符号位不变,数值位取反+1
故:[X]补=11001100B,[X]反=11001011B。
(2) 已知补码,求原码。
分析:按照求负数补码的逆过程,数值部分应是最低位减1,然后取反。但是对二进制数来说,先减1后取反和先取反后加1得到的结果是一样的,故仍可采用取反加1 有方法。
例:已知某数X的补码11101110B,试求其原码。
解:由[X]补=11101110B知,X为负数。
1 1 1 0 1 1 1 0 补码
1 1 1 0 1 1 0 1 反码(符号位不变,数值位取反加1)
1 0 0 1 0 0 1 0 原码(符号位不变,数值位取反)
关于补码的补充例子:
一个正的整数的补码就是这个整数变成二进制的值。
举例:一个int型变量i=10,其二进制补码就是0000 0000 0000 0000 0000 0000 0000 1010(0x0000000A)
2. 一个负整数的二进制补码,就是该负数的绝对值所对应的补码全部取反后加1.
举例:int i=-10的补码如何求得:
先求-10的绝对值10的补码是0000 0000 0000 0000 0000 0000 0000 1010(0x0000000A);
再将求得的补码取反: 1111 1111 1111 1111 1111 1111 1111 0101
再将取反后得到的补码加1: 1111 1111 1111 1111 1111 1111 1111 0101 + 1
即可得到-10的二进制补码: 1111 1111 1111 1111 1111 1111 1111 0110(0xFFFFFFF6)
3. +0和-0的二进制补码都是0
首先+0的二进制补码是0;
-0的二进制补码是+0的二进制补码取反后加1,+0的二进制补码为0,取反后为FFFFFFFF,加1后还是0
原码和反码在数值0都有二意,唯有补码在数值0是唯一的码值!
C语言中,原码,补码和反码怎么换算?
换算方法如下:
数在计算机中是以二进制形式表示的。
数分为有符号数和无符号数,原码、反码、补码都是有符号定点数的表示方法。
一个有符号定点数的最高位为符号位,0是正,1是副;【原码】就是这个数本身的二进制形式。
正数的【反码】和补码都是和原码相同;负数的【反码】是将其原码除符号位之外的个位求反。
正数的反码和【补码】都是和原码相同;负数的【补码】是将其原码除符号位之外的各位求反之后在末位再加1。
拓展资料:计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,"正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过是我们绝大多数人生来具有10个手指头这个解剖学事实的结果。
尽管在历史上手指计数(5,10进制)的实践要比二或三进制计数出现的晚。".为了能方便的与二进制转换,就使用了十六进制(2 4)和八进制1.数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了。
树的应用:二叉排序树
排序是一种十分重要的运算。所谓排序就是把一堆杂乱无章的元素按照某种次序排列起来,形成一个线性有序的序列。二叉排序树是利用二叉树的结构特点来实现对元素排序的。
一、二叉排序树的定义
二叉排序树或者是空树,或者是具有如下性质的二叉树:
1、左子树上所有结点的数据值均小于根结点的数据值;
2、右子树上所有结点的数据值均大于或等于根结点的数据值;
3、左子树、右子树本身又各是一棵二叉排序树。
由此可见,二叉排序树是一种特殊结构的二叉树。(18(10(3,15(12,15)),21(20,21(,37))))就是一棵二叉排序树。
思考题1:试将上述括号表示法表示的二叉排序树用图形表示法表示出来。图
思考题2:试用中序遍历二叉树的方法写出遍历二叉排序树的结果,并思考二叉排序树究竟有什么作用?。
二、二叉排序树的构造
二叉排序树的构造过程实质上就是排序的过程,它是二叉排序树作媒介,将一个任意的数据序列变成一个有序序列。二叉排序树的构造一般是采用陆续插入结点的办法逐步构成的。具体构造的思路是:
1、以待排序的数据的第一个数据构成根结点;
2、对以后的各个数据,逐个插入结点,而且规定:在插入过程的每一步,原有树结点位置不再变动,只是将新数据的结点作为一个叶子结点插入到合适的位置,使树中任何结点的数据与其左、右子树结点数据之间的关系仍然符合对二叉排序树的要求。
思考题3:试根据上述构造二叉排序树的思路,画出待排序数据(50,54,71,23,48,55,79,32,21)的二叉排序树图。
总结:构造二叉排序树的算法思想如下:设A={a1,a2,...,an}为一组元素的集合,
1、令a1为二叉排序树的根;
2、在保持二叉排序树性质的前提下,依次把a2,a3,...,an插入到该树中。
二叉排序树的生成算法:
Procedure createbst(Var t:pointer);
{构造一棵以t指向根结点的二叉排序树,插入数据以‘#’结束}
Begin
t:=nil; {初始化}
read(x); {输入元素值x}
while (x<>'#') do
begin
new(s);s^.Lc:=nil;s^.Rc:=nil;
s^.data:=x;
insertnode(s,t);
read(x)
end;
end.
其中,插入一个结点的算法insertnode(s,t)如下:
Procedure insertnode(s:pointer;Var t:pointer);
{s指向待插入结点,t是bst的根}
Begin
if t=nil then t:=s
else if s^.data < t^.data then insertnode(s,t^.Lc)
else insertnode(s,t^.Rc)
end.
没有说到正地方的啊!
00010111
+ 1
-----------
00011000 (补码)
好好看看书吧,求补码还有更好的方法,
就是(负数的)原码从右向左数第一个1不变(第一个1之前的0不变),向左其他都取反,等老师教你吧。看文字不怎么容易理解。看看下面能不能有点启示吧。
00011000(补码)
11101000(原码)要是有符号位的话,符号位应该不变。
在计算机系统中,数值,一律用补码表示和存储。
计算机中,并没有原码和反码。
那么,
为什么只是使用补码?
什么是补码?
补码和数值,是怎么换算的?
了解这些,就应该从“补数”说起。
如果限定了参加“计算的位数”,就会发生不同寻常的事。
一般的计算,是用十进制来进行的。
如果,限定,只使用两位数:00~99。
那么,-1 和 +99,功能就是相同的:
25 - 1 = 24
25 + 99 = (一百) 24
在这里,99,就是-1 的“补数”。
一百,就是 10^2,则称为:计数周期。
补数的计算公式: 99 + |-1 | = 周期。
------------------------
计算机使用二进制,补数,就改称为:补码。
八位机,就是用 8 位二进制,来参加计算。
计数范围:0000 0000~1111 1111(十进制 255)。
计数周期就是:2^8 = 256。
那么:
-1 的补码,就是 256-1 = 255 = 1111 1111。
-2 的补码,就是 256-2 = 254 = 1111 1110。
。。。
求补码的通用公式,就是:周期 + 负数。
补码,就是补码。
补码和原码反码,并没有任何关系。
求补码,并不需要借助于原码和反码。
------------------------
在计算机中,利用补码,就能:用加法代替减法运算。
因此,就可以简化计算机的硬件。
例如,用补码计算: 3 + (-1) = 2。
0000 0011 (= 3)
+ 1111 1111 (用 255 当做-1)
---------------------
(1) 0000 0010 (= 2)
舍弃进位,只取八位的结果,这算法,就完全正确。
先学会二进制的加减运算吧。
换算方法如下:
1、数在计算机中是以二进制形式表示的。
2、数分为有符号数和无符号数,原码、反码、补码都是有符号定点数的表示方法。
3、一个有符号定点数的最高位为符号位,0是正,1是副;【原码】就是这个数本身的二进制形式。
4、正数的【反码】和补码都是和原码相同;负数的【反码】是将其原码除符号位之外的个位求反。
拓展资料1、C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
2、尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
什么是原码 补码 反码?
请我给详解:原码、补码反码
(1)原码表示
原码表示机器数种简单表示其符号位用0表示号用:表示负号数值般用二进制形式表示设数x则原码表示记作〔x〕原
例X1=
+1010110
X2=
1001010
其原码记作:
〔X1〕原=[+1010110]原=01010110
〔X2〕原=[-1001010]原=11001010
原码表示数范围与二进制位数关用8位二进制表示数原码其表示范围:
值0.1111111其真值约(0.99)10
值1.1111111其真值约(0.99)10
用8位二进制表示整数原码其表示范围:
值01111111其真值(127)10
值11111111其真值(-127)10
原码表示0两种表示形式:
〔+0〕原=00000000
[-0]
原=10000000
(2)补码表示
机器数补码由原码机器数数则该机器数补码与原码;机器数负数则该机器数补码原码(除符号位外)各位取反并未位加1设数X则X补码表示记作〔X〕补
例[X1]=+1010110
[X2]=
1001010
[X1]原=01010110
[X1]补=01010110
即
[X1]原=[X1]补=01010110
[X2]
原=
11001010
[X2]
补=10110101+1=10110110
补码表示数范围与二进制位数关采用8位二进制表示数补码表示范围:
0.1111111其真值(0.99)10
1.0000000其真值(1)10
采用8位二进制表示整数补码表示范围:
01111111其真值(127)10
10000000其真值(128)10
补码表示0种表示形式:
[+0]补=00000000
[+0]补=11111111+1=00000000(由于受设备字限制进位丢失)
所[+0]补=[+0]补=00000000
(3)反码表示
机器数反码由原码机器数数则该机器数反码与原码;机器数负数则该机器数反码原码(符号位除外)各位取反设数X则X反码表示记作〔X〕反
例:X1=
+1010110
X2=
1001010
〔X1〕原=01010110
[X1]反=〔X1〕原=01010110
[X2]原=11001010
[X2]反=10110101
反码通作求补程间形式即负数反码未位加1该负数补码
例1.
已知[X]原=10011010求[X]补
析:
由[X]原求[X]补原则:若机器数数则[X]原=[X]补;若机器数负数则该机器数补码原码(符号位除外)所位求反再未位加1现给定机器数负数故[X]补=[X]原十1即
[X]原=10011010
[X]反=11100101
十)
1
[X]补=11100110
例2.
已知[X]补=11100110求〔X〕原
析:
于机器数数则〔X〕原=〔X〕补
于机器数负数则〔X〕原=〔〔X〕补〕补
现给定负数故:
〔X〕补=11100110
〔〔X〕补〕反=10011001
十)
1
〔〔X〕补〕补=10011010=〔X〕原
或者说:
数计算机二进制形式表示
数符号数符号数
原码、反码、补码都符号定点数表示
符号定点数高位符号位01副
都8位整数例
原码数本身二进制形式
例
0000001
+1
1000001
-1
数反码补码都原码相同
负数反码其原码除符号位外各位求反
[-3]反=[10000011]反=11111100
负数补码其原码除符号位外各位求反末位再加1
[-3]补=[10000011]补=11111101
数补码逆
要设立补码呢
第能让计算机执行减:
[a-b]补=a补+(-b)补
第二原统0负0
零:00000000
负零:10000000
两数其实都0原码却同表示
补码都00000000
特别注意+1进位要直往前进位包括符号位(反码同)
[10000000]补
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(高位溢符号位变0)
问
10000000补码表示哪数补码呢
其实规定数表示-128
所n位补码能表示范围
-2^(n-1)2^(n-1)-1
比n位原码能表示数
例:
1011
原码:01011
反码:01011
//数反码=原码
补码:01011
//数补码=原码
-1011
原码:11011
反码:10100
//负数反码原码取反
补码:10101
//负数补码原码取反+1
0.1101
原码:0.1101
反码:0.1101
//数反码=原码
补码:0.1101
//数补码=原码
-0.1101
原码:1.1101
反码:1.0010
//负数反码原码取反
补码:1.0011
//负数补码原码取反+1
计算机内定点数3种表示:原码、反码补码
所谓原码前面所介绍二进制定点表示即高位符号位0表示1表示负其余位表示数值
反码表示规定:数反码与其原码相同;负数反码其原码逐位取反符号位除外
补码表示规定:数补码与其原码相同;负数补码其反码末位加1
假设
int
类型数值5我知道计算机表示:
00000000
00000000
00000000
00000101
5转换二制101int类型数占用4字节(32位)所前面填堆0
现想知道-5计算机何表示
计算机负数其值补码形式表达
叫补码呢原码反码说起
原码:整数按照绝值转换二进制数称原码
比
00000000
00000000
00000000
00000101
5
原码
反码:二进制数按位取反所新二进制数称原二进制数反码
取反操作指:原10;原01(1变0;
0变1)
比:00000000
00000000
00000000
00000101每位取反11111111
11111111
11111111
11111010
称:11111111
11111111
11111111
11111010
00000000
00000000
00000000
00000101
反码
反码相互所称:
11111111
11111111
11111111
11111010
00000000
00000000
00000000
00000101
互反码
补码:反码加1称补码
说要数补码先反码反码加1所数称补码
比:00000000
00000000
00000000
00000101
反码:11111111
11111111
11111111
11111010
补码:
11111111
11111111
11111111
11111010
1
=
11111111
11111111
11111111
11111011
所-5
计算机表达:11111111
11111111
11111111
11111011转换十六进制:0xFFFFFFFB
再举例我看整数-1计算机何表示
假设int类型:
1、先取1原码:00000000
00000000
00000000
00000001
2、反码:
11111111
11111111
11111111
11111110
3、补码:
11111111
11111111
11111111
11111111
数原码,补码,反码都相同,都等于本身
负数补码:符号位1,其余各位求反,末位加1
反码:符号位1,其余各位求反,末位加1
说,反码末位加1补码
1100110011
原
1011001100
反
除符号位按位取反
1011001101
补
除符号位按位取反再加1
数原反补
计算机数据补码形式存储:
n位机器数高位符号位该位零表示1表示负;
其余n-1位数值位各位值0或1
真值:原码、反码、补码数值位完全相同;
真值负:
原码数值位保持原
反码数值位原码数值位各位取反
补码则反码低位加
注意符号位变
:若机器数16位:
十进制数
17
原码、反码与补码均:
0000000000010001
十进制数-17
原码、反码与补码别:1000000000010001、1111111111101110、1111111111101111
原码就是原机器编码;
补码:如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到;
反码:如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的
原码:就是二进制码
补码:就是二进制码,但是正数的补码是,负数则不同,原码(除符号位外)各位取反,并在未位加1
反码:正数就是进制码,负数原码除符号位外各取反就是。
原码就是用一个n位的二进制数,其中最高位为符号位:正数为0,负数为1。剩下的n-1位表示概数的绝对值。例如:
X=+101011
,
[X]原=
00101011
X=-101011
,
[X]原=
10101011
,位数不够的用0补全。
反码就是在原码的基础上,符号位不变其他位按位取反(就是0变1,1变0)就可以了。例如:X=-101011
,
[X]原=
10101011 ,[X]反=11010100。
补码就是在反码的基础上按照正常的加法运算加1。例如:X=-101011
,
[X]原=
10101011 ,[X]反=11010100,[X]补=11010101
PS:0的补码是唯一的,如果机器字长为8那么[0]补=00000000。
简单说就是二进制数
分正数和负数之分
正数的原码
反码
补码
都一样
负数的反码是0变1
1变0
补码就是在反码的基础上加1.
明白不
?
好好整吧,加油
相信你一定能搞定。
你是在学C语言吧
其实这几种码制转换不用买什么书的,
多看几次c语言的书,多记几个相关的例子就可以了,
下面是一些资料,多看几遍就行:
1、在计算机系统中,数值一律用补码来表示(存储)。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补
码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
2、补码与原码的转换过程几乎是相同的。
数值的补码表示也分两种情况:
(1)正数的补码:与原码相同。
例如,+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码
0000111按位取反为1111000;再加1,所以-7的补码是11111001。
已知一个数的补码,求原码的操作分两种情况:
(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取
反,然后再整个数加1。
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负
数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。
在“闲扯原码、反码、补码”文件中,没有提到一个很重要的概念“模”。我在这里稍微介绍一下“模”
的概念:
“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范
围,即都存在一个“模”。例如:
时钟的计量范围是0~11,模=12。
表示n位的计算机计量范围是0~2(n)-1,模=2(n)。【注:n表示指数】
“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的
余数。任何有模的计量器,均可化减法为加法运算。
例如:
假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:
一种是倒拨4小时,即:10-4=6
另一种是顺拨8小时:10+8=12+6=6
在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。
对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特
性。共同的特点是两者相加等于模。
对于计算机,其概念和方法完全一样。n位计算机,设n=8,
所能表示的最大数是11111111,若再
加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的
模为2(8)。
在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以
了。把补数用到计算机对数的处理上,就是补码。
另外两个概念
一的补码(one's
complement)
指的是正数=原码,负数=反码
而二的补码(two's
complement)
指的就是通常所指的补码。
这里补充补码的代数解释:
任何一个数都可以表示为-a=2^(n-1)-2^(n-1)-a;
这个假设a为正数,那么-a就是负数。而根据二进制转十进制数的方法,我们可以把a表示为:a=k0*2^0+k1*2^1+k2*2^2+……+k(n-2)*2^(n-2)
这里k0,k1,k2,k(n-2)是1或者0,而且这里设a的二进制位数为n位,即其模为2^(n-1),而2^(n-1)其二项展开是:1+2^0+2^1+2^2+……+2^(n-2),而式子:-a=2^(n-1)-2^(n-1)-a中,2^(n-1)-a代入a=k0*2^0+k1*2^1+k2*2^2+……+k(n-2)*2^(n-2)和2^(n-1)=1+2^0+2^1+2^2+……+2^(n-2)两式,2^(n-1)-a=(1-k(n-2))*2^(n-2)+(1-k(n-3))*2^(n-3)+……+(1-k2)*2^2+(1-k1)*2^1+(1-k0)*2^0+1,而这步转化正是取反再加1的规则的代数原理所在。因为这里k0,k1,k2,k3……不是0就是1,所以1-k0,1-k1,1-k2的运算就是二进制下的取反,而为什么要加1,追溯起来就是2^(n-1)的二项展开式最后还有一项1的缘故。而-a=2^(n-1)-2^(n-1)-a中,还有-2^(n-1)这项未解释,这项就是补码里首位的1,首位1在转化为十进制时要乘上2^(n-1),这正是n位二进制的模。
c语言中补码和反码是什么意思,求例子,谢谢
计算机中,只有补码,并没有原码和反码。
补码,是带符号数,在计算机中的储存形式。
C 语言是高级语言。
用高级语言编程,只能、也必须,使用正负数字,不能用补码。
如果需要使用补码,那就不是高级语言了。
高级语言,是不用涉及到计算机内部的。
所以,计算机内部的补码,就和高级语言毫无关系。
在 C 语言中,讨论“原码反码补码”,都是没有影的事。
有些作者,明显是个外行,写教材时,东拉西扯的。
显得他是多么的高(yu)明(chun)。
int x = -68;
经过编译,-68,就以其补码,存入到计算机中了。
反码,是没有任何用处的。
所以,在计算机中,并没有原码和反码。
有人说:
正数的原码反码补码,都相等。
那就是无聊的人,随便闲聊而已。
计算机中,根本就没有原码反码,哪有可能相等!
数在计算机中是以二进制形式表示的。
数分为有符号数和无符号数。
原码、反码、补码都是有符号定点数的表示方法。
一个有符号定点数的最高位为符号位,0是正,1是负。
以下都以8位整数为例,
原码就是这个数本身的二进制形式。
例如
1000001 就是-1
0000001 就是+1
正数的反码和补码都是和原码相同。
负数的反码是将其原码除符号位之外的各位求反
[-3]反=[10000011]反=11111100
负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。
[-3]补=[10000011]补=11111101
一个数和它的补码是可逆的。
为什么要设立补码呢?
第一是为了能让计算机执行减法:
[a-b]补=a补+(-b)补
第二个原因是为了统一正0和负0
正零:00000000
负零:10000000
这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000
特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)
[10000000]补
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符号位变成了0)
有人会问
10000000这个补码表示的哪个数的补码呢?
其实这是一个规定,这个数表示的是-128
所以n位补码能表示的范围是
-2^(n-1)到2^(n-1)-1
比n位原码能表示的数多一个