首页 > 编程知识 正文

c语言补码,16位二进制数原码反码补码的范围

时间:2023-05-06 13:19:47 阅读:39632 作者:4757

1 .在计算机中,通常用数字后面跟英文字母来表示该数量的数字

十进制一般用d表示,二进制用b表示,八进制用o表示,十六进制用h表示,

2.

首先,将十进制转换为二进制,除2之外去掉馀数,按箭头方向书写,从上到下书写,所以将45D转换为二进制时为101101B

3.

将十进制数转换为十六进制数,除以十六进制数。 十六进制数一般使用0~9、a、b、c、d、e、f。 因此,如果将117D转换为十六进制数,则为75H。

6.2十六进制

二进制:每个位由四位二进制表示,最终是相应的二进制数。 示例:

A19CH

: A=10 (十进制(a=10,1=0001,9=1001,C=12 )十进制)=1100,

所以A19CH=

1010000110011100B

7 .机器数量

通常,机器的数量是符号“数字化”的数量,是数字在计算机中的二进制表现形式。

一() :

的符号进行量化。 实用的数据有正数和负数。 计算机内部的硬件只能表示两种物理状态(用0和1表示),因此实用数据的正号()或负号()、)-)在机器中用一位二进制0或1来区分。 此符号通常位于二进制数的顶部,称为符号位,0表示符号“”,1表示符号“-”。 因为符号占1位,所以数值的形式值不等于真数值,与带符号位数的机器数相对应的数值称为机器数的真值。 例如二进制真数值-011011、其机械

1011011。

二:

二进制位数受机械设备的限制。 机器内部设备一次可以显示的二进制数称为机器字长,一台机器字长是固定的。 字长8位称为1字节(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点整。 有表,但只有八点整,比北京时间快两个小时。 校正的方法有两种。 一个是倒带两个小时,另一个是加拨10个小时。 如果规定为减去倒带,加上正相加,则对于手表来说负2等于正10。 也就是说,负2可以用正10来实现。 这个8加10等于18,但手表最多只能指示12。 如果大于12,则12自然丢失,18减去12只剩下6。 这表明,在有减法的条件下,可以用加法代替。 这里,将“12”称为“模”,将10称为“-2”的模12的补数。 要普遍普及,请执行以下操作

ab=a (BM ) 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的补码只有8种表示法: 0,0000000。

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,跟我们用十进制算出来的结果一样。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。