liuxianhua
级别: 论坛先锋
精华主题: 0
发帖数量: 611 个
工控威望: 1067 点
下载积分: 10234 分
在线时间: 572(小时)
注册时间: 2008-11-19
最后登录: 2013-02-22
查看liuxianhua的 主题 / 回贴
楼主  发表于: 2010-04-15 12:44
书上说16位数据寄存器的最高为符号位,0为正数1为负数,正数的最大值为32767,负数的最大值为-32768,这我就不明白了,除了符号位外,其他15位都为1时,加起来是32767,为什么负数能储存最高数是-32768呢?恳请高手指点,谢谢,谢谢!!
sjm213
有小知识,无大学问。
级别: 论坛版主

精华主题: 7 篇
发帖数量: 5200 个
工控威望: 7423 点
下载积分: 158809 分
在线时间: 3162(小时)
注册时间: 2007-11-21
最后登录: 2024-11-26
查看sjm213的 主题 / 回贴
1楼  发表于: 2010-04-17 23:06
正数原码与反码、补码一致;
负数反码是将其原码除符号位之外的各位求反,补码是将反码加1。
所以4楼的解释是有问题的。
-5的二进制的原码是 1000 0000 0000 0101
                        反码是 1111  1111 1111 1010
                        补码是 1111 1111 1111  1011
----------------------------------------------------------------------------------------------
以下转载,解释有符号的数范围为何是-(n+1)~n:
为什么要设立补码呢?

第一是为了能让计算机执行减法:
[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位原码能表示的数多一个
本帖最近评分记录:
  • 下载积分:+4(njaolian) 解释太详细了,不给对不 ..
    sjm213
    有小知识,无大学问。
    级别: 论坛版主

    精华主题: 7 篇
    发帖数量: 5200 个
    工控威望: 7423 点
    下载积分: 158809 分
    在线时间: 3162(小时)
    注册时间: 2007-11-21
    最后登录: 2024-11-26
    查看sjm213的 主题 / 回贴
    2楼  发表于: 2010-04-21 22:57
    楼上,要记住:
    在计算机系统中,数值一律用补码来表示(存储)。
    主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补
    码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
    ---------------------------------------
    所以在PLC的地址寄存器中赋值一个负数,在监控其各个位就会发现1、0的排布与其反码一致!