16位⼆进制补码c语⾔,2,16进制原码补码反码问题
1. 在计算机⾥,通常⽤数字后⾯紧跟⼀个英⽂字母来表⽰该数的数字,
⼗进制⼀般⽤D,⼆进制⽤B,⼋进制⽤O,⼗六进⽤H来表⽰,
2.
⾸先,⼗进制数转换成⼆进制,除2取余,按箭头⽅向写,⾃上⽽下写出来,所以45D转换成⼆进制为:101101B
3.
⼗进制数转换成⼗六进除16取余,16进制⼀般⽤0~9,A,B,C,D,E,F,所以,117D转换成⼗六进制为:75H,
6.2 ⼗六进制
到⼆进制:每⼀位⽤4位⼆进制数来表⽰,最终形成对应的⼆进制数,如:
两个负数的补码相加A19CH
:A=10(⼗进制)=1010 ,1 = 0001 ,9 = 1001,C = 12(⼗进制)=1100,
所以A19CH =
1010000110011100B
7.机器数
通常,机器数是把符号"数字化"的数,是数字在计算机中的⼆进制表⽰形式。
⼀:
数的符号数值化。实⽤的数据有正数和负数,由于计算机内部硬件只能表⽰两种物理状态(⽤0和1表⽰),因此实⽤数据的正号“+”或负
号“-”,在机器⾥就⽤⼀位⼆进制的0或1来区别。通常这个符号放在⼆进制数的最⾼位,称符号位,以0代表符号“+”,以1代表符
号“-”。因为有符号占据⼀位,数的形式值就不等于真正的数值,带符号位的机器数对应的数值称为机器数的真值。例如⼆进制真值数-011011,它的机器
1011011。
⼆:
⼆进制的位数受机器设备的限制。机器内部设备⼀次能表⽰的⼆进制位数叫机器的字长,⼀台机器的字长是固定的。字长8位叫⼀个字节(Byte),现在机器字长⼀般都是字节的整数倍,如字长8位、16位、32位、64位。
三:
机器数可以⽤不同的码制来表⽰,常⽤的有原码,补码,和反码表⽰法。
将数的真值形式中“+”号⽤“0”表⽰,“-”号⽤“1”表⽰时,叫做数的原码形式,简称原码。若字长为n位,原码⼀般可表⽰为:
(1)当X为正数时[X]原和X⼀样,即[X]原 =
X。当X为负数时。由于X本⾝为负数,所以,实际上是将∣X∣数值部分绝对值前⾯的符号位上写成“1”即可。
原码表⽰法⽐较直观,它的数值部分就是该数的绝对值,⽽且与真值、⼗进制数的转换⼗分⽅便。但是它的加减法运算较复杂。当两数相加时,机器要⾸先判断两数的符号是否相同,如果相同则两数相加,若符号不同,则两数相减。在做减法前,还要判断两数绝对值的⼤⼩,然后⽤⼤数减去⼩数,最后再确定差的符号,换⾔之,⽤这样⼀种直接的形式进⾏加运算时,负数的符号位不能与其数值部分⼀道参加运算,⽽必须利⽤单独的线路确定和的符号位。要实现这些操作,电路就很复杂,这显然是不经济实⽤的。为了减少设备,解决机器内负数的符号位参加运算的问题,总是将减法运算变成加法运算,也就引进了反码和补码这两种机器数。
4.2 反码
如前所述,为了克服原码运算的缺点,采⽤机器数的反码和补码表⽰法。若字长为n位,反码可表⽰为:
(2)即对正数来说,其反码和原码的形式相同;对负数来说,反码为其原码的数值部分各位变反。
4.3 补码
补码是根据同余的概念引⼊的,我们来看⼀个减法通过加法来实现的例⼦。假定现在是北京时间6点整,有⼀只⼿表却是8点整,⽐北京时间快了2⼩时,校准的⽅法有两种,⼀种是倒拨2⼩时,⼀种是正
拨10⼩时。若规定倒拨是做减法,正拨是做加法,那么对⼿表来讲减2与加10是等价的,也就是说减2可以⽤加10来实现。这是因为8加10等于18,然⽽⼿表最⼤只能指⽰12,当⼤于12时12⾃然丢失,18减去12就只剩6了。这说明减法在⼀定条件下,是可以⽤加法来代替的。这⾥“12”称为“模”,10称为“-2”对模12的补数。推⼴到⼀般则有:
A –
B = A + ( – B + M ) = A + ( – B
)补
总之,正数的原码、反码和补码是完全相同的;负数的原码、反码和补码其形式各不相同。另外,特别要注意的是,对于负数的反码和补码(即符号位为1的数),其符号位后边的⼏位数表⽰的并不是此数的数值。如果要想知道此数的⼤⼩,⼀定要求其反码或补码才⾏。
多数机器⾥⾯都是采⽤补码表⽰,正数采⽤符号+绝对值表⽰,如:假设机器字长为8位,则[+1]补 =
00000001,[+127]补=01111111,[+0]补=00000000,当⽤补码表⽰法表⽰负数时,负数X⽤2的n次⽅-[X]来表⽰,其中n为机器的字长。如:[-1]补
= 28-1 = 11111111,[-127]补 =
28-127=256-127=129=1000001,0的补码就只有⼀种表⽰法:⼋个0,00000000.
对于10000000这个数,在补码表⽰法中被定义为-128,采⽤补码形式表⽰的有符号数,那么n位⼆进制数据能够表⽰的有符号整数的范围是:-2(n-1)~2(n-1)-1
是n-1次⽅(我现在能够理解补码了,也能理解这个范围了,我以前好像陷⼊了⼀个这种误解,⽼是以为这个范围,是这样得出的,⽐如,负数,最⾼位是1,对于机器字长8位来说,剩余的七位全是1,即1111111,加起来,就是⼋个11111111,然后,最⼩的就是8个
0,00000000,然后把这个数转换成相应的⼗进制,就是范围,其实,我理解错了,为什么呢,这⾥的所谓的11111111是补码,⽽我把补码的表⽰当成了原码的表⽰来转换成⼗进制,这就是错误的根源,说明我以前是没理解补码和原码的区别)
那么,8位表⽰的有符号数的范围是:-128~127,如果n
=16,那么能够表⽰的有符号数整数的范围是-32768~32767(记住这个范围)
例如,假设机器字长是16位,写出-117D的补码表⽰:
-117D = 216-117D 我把每个数都转化成2进制,也就是1 0000
0000 0000 0000 – 0000 0000 0111 0101 = 1111 1111 1000 1011
这个数转换成六进制就是 FF8BH。
我采⽤书上的解法就是:
⾸先:+117D可表⽰为: 0000 0000 0111 0101
按位求反后为 1111 1111
1000 1010
某位加1 后: 1111 1111
1000 1011
表⽰成⼗六进制: F F 8 B(最终结果)
如果,对于⽆符号数来说,8位⽆符号数的表⽰范围:0<=n<=2的n次⽅-1,即:0~255
16位⽆符号数的表⽰范围:0<=n<=2n的n次⽅-1,即:0~65535(也要记住)
符号扩展,常需要把⼀个n位⼆进制数扩展为m位⼆进制数,(m>n),当要扩充的数⼗⽆符号数时,只要在最⾼位前扩展m-n个0,例
如,21的8位⼆进制和16位⼆进制的补码表⽰如下:00010101
8位, 0000000000010101 16位
如果要扩展的数是有符号数,并且采⽤补码形式表⽰,进⾏符号扩展,如:-3的8位⼆进制补码和16位⼆进制补码如下:-3 1111 1101
8位补码,1111 1111 1111 1101 16位补码,
补码的加法和减法
把⼀个⼆进制按位求反,末位加1的运输称为求补运算。求补运算有个特性,[X]补---》求补[-x]补
--à求补[X]补,就是,⽐如,3的补码表⽰是:00000011,这个数求补:11111101
-3,对-3再求补,就变成了00000011,则⼜变成了整数3,
例如:⽤8位⼆进制计算,25+(-32)
我们⽤求补码的⽅式来解决这个问题,25是整数,他的补码为:00011001,
(-32)的补码是:先求32的补码:00100000,对它求反:11011111,末尾加1,得:11100000,然后把它与25的补码00011001相加得11111001,这个数最⾼位为1,肯定是个负数,我们对这个数求反再末尾加1,得00000111,刚好为7,根据补码的那个求补特性,[X]补---》求补[-x]补
--à求补[X]补,所以11111001就是-7,跟我们⽤⼗进制算出来的结果⼀样。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。