你是在学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位二进制的模。
请我给详解:原码、补码反码
(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。