有符号位数的运算

无符号数:最高位不用来表示正负,它没有负数,比如,4位无符号数表示的范围,0000-1111,大小即0-15,

有符号数:最高位用来表示正负

原码反码补码

    0正1负数 最高位永远是符号位

    当二进制为正数时,原码、反码、补码相同

    当二进制为负数时,反码=原码的数值位逐一取反,补码=反码在最低位加1

数值在计算机的表示都是用补码来表示的,所以计算机的加减法都是补码的加减法,比如

 [+1] = [00000001]原 = [00000001]反 = [00000001]补

 [-1] = [10000001]原 = [11111110]反 = [11111111]补


1000 0000=-128     0000 0000=0      1111 1111=127

 (-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补


int4个字节  每个字节8位  共32位 Integer是有符号的
Integer.MAX_VALUE 01111111 11111111 11111111 11111111 = 2^31-1 = 2147483647 21亿   0x7fffffff
Integer.MIN_VALUE 10000000 00000000 00000000 00000000 = -2^31 = -2147483648 -21亿  0x80000000


System.out.println(Integer.MAX_VALUE);     2147483647
System.out.println(Integer.MAX_VALUE + 1); -2147483648
System.out.println(Integer.MIN_VALUE);     -2147483648
System.out.println(Integer.MIN_VALUE - 1); 2147483647


这是一个困惑了我几年的问题,它让我对现在的教科书和老师极其不满,从我N年前开始摸电脑时,就几乎在每一本C++教科书上都说,8位有符号的取值范围是-128~+127,为什么不是-127~+127呢,后来的java,int的聚值范围,再32位计算,-2^31 ~ +2^31-1,可是,却从来没有任何一本教科书或一个老师比我解释过这个问题。 原因没有在工作上或者是什么地方直接遇到它,所以我也一直忽略它,但心里总是有一根刺.直到刚才!!!!

就是刚才,无聊之极,在看汇编的书时,又遇到它了,但一如以往,书上直接地,有心地,明显地绕过了这个问题,真是可恶啊.     几经周折,终于把它搞清楚了: 
其实,它是计算机底层为了实现数值运算而决定的,涉及非常非常基础的原码,反码,补码知识,一般(99.9999%)都不会用得上. 那0.0001%,估计也就是计算机考试了. 
    话说: 
    用2^8来表示无符号整数的话,全世界的理解都是0 - 255了,那么,有符号呢? 用最高位表示符号,0为+,1为-,那么,正常的理解就是 -127 至 +127 了. 
    这就是原码了,值得一提的是,原码的弱点,有2个0,即+0和-0,还有就是,进行异号相加或同号相减时,比较笨蛋,先要判断2个数的绝对值大小,然后进行加减操作,最后运算结果的符号还要与大的符号相同. 
于是乎,反码产生了,原因....略,反正,没过多久,反码就成为了过滤产物,也就是,后来补码出现了. 
     补码的知识不说述,只说有关+127和-128的. 
     官方的定义 [-2^(n-1),2(n-1)-1],补码的0没有正负之分.原因呢?没有一本书上有说,这也是我这么火的原因,但通过思考,google,再思考,很快找到答案:      首先,难不免干点白痴般地事情,穷举一下... 正数,原码跟补码一样 

+127, 0111 1111 

+126, 0111 1110 

+125, 0111 1101 

+124, 0111 1100 

+123, 0111 1011 

+122, 0111 1010 ... 
  +4, 0000 0100  

 +3, 0000 0011   

+2, 0000 0010   

+1, 0000 0001 
   0, 0000 0000 (无正负之分)  
下面是负数了,值,原码,符号位不变其它取反,+1   

-1, 1000 0001, 1111 1110, 1111 1111 
-2, 1000 0010, 1111 1101, 1111 1110   

-3, 1000 0011, 1111 1100, 1111 1101   

-4, 1000 0100, 1111 1011, 1111 1100   

-5, 1000 0101, 1111 1010, 1111 1011   

-6, 1000 0110, 1111 1001, 1111 1010   

-7, 1000 0111, 1111 1000, 1111 1001   

-8, 1000 1000, 1111 0111, 1111 1000   

-9, 1000 1001, 1111 0110, 1111 0111 

-10, 1000 1010, 1111 0101, 1111 0110 

-11, 1000 1011, 1111 0100, 1111 0101 

-12, 1000 1100, 1111 0011, 1111 0100 

-13, 1000 1101, 1111 0010, 1111 0011 

-14, 1000 1110, 1111 0001, 1111 0010 

-15, 1000 1111, 1111 0000, 1111 0001 

-16, 1001 0000, 1110 1111, 1111 0000 

-17, 1001 0001, 1110 1110, 1110 1111 ... 

-24, 1001 1000, 1110 0111, 1110 1000 ... 
-99, 1110 0011, 1001 1100, 1110 0100 ... 
-124, 1111 1100, 1000 0011, 1000 0100 

-125, 1111 1101, 1000 0010, 1000 0011 

-126, 1111 1110, 1000 0001, 1000 0010 

-127, 1111 1111, 1000 0000, 1000 0001 

看出点什么了没有? 
如果没有,那么,给个提示, 再继续下去,下一个补码是什么呢? 

当然是 

-128, 先略过,再略过, 

1000 0000 1000 0000,那么,它的原码是什么呢? 
从补码求原码的方法跟原码求补码是一样的 
先保留符号位其它求反:  1111 1111, 再加1:11000 0000, 超过了8位了 

对,用8位数的原码在这里已经无法表示了 
关键就在这里,补码 1000 0000 为 -128 是不用怀疑的(上面的穷举),

 那么,回到原码处, 它的原码也是 1000 0000(超出的自动丢失), 

1000 0000 在原码表示什么呢? -0, 但补码却规定0没有正负之分

 转换一下思路,看看计算机里,是怎么运算的: 

对于负数,先取绝对值,然后求反,加一 
-128 -> 128 -> 1000 0000 -> 0111 1111 -> 1000 0000 

现在明确了吧. 
所以, 8位有符号的整数取值范围的补码表示 

1000 0000 到 0000 0000, 再到 0111 1111 

即 -128 到 0, 再到 127 

最终 -128 ~ +127

  • 21
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 74ls181 组成的运算器通路可以区分有符号运算和无符号运算。两者的运算过程有所不同。在有符号运算中,需要进行符号扩展,即将符号位复制到高位,以保持运算结果的正确性。而在无符号运算中,不需要进行符号扩展。 两者的值表示范围也不同。在有符号运算中,使用补码表示,最高位为符号位,因此可以表示的范围为-2^(n-1)到2^(n-1)-1,其中n为位数。而在无符号运算中,所有位均为值位,可以表示的范围为0到2^n-1。 ### 回答2: 74ls181是八位全加器/累加器,由四个全加器和一些控制逻辑组成。虽然它可以用于有符号和无符号运算,但是它并不能自动区分这两种类型的。 在无符号运算中,每位上的值都是正整,没有负。因此,全加器不需要进行任何转换,仍然按照加法器的方式进行计算。如果结果超出了八位二进制的范围,那么只能保存低八位,高位舍去。所以,无符号值范围是从0到255。 在有符号运算中,最高位代表符号位,0表示正,1表示负。在计算过程中,我们需要对负进行补码操作,即将符号位之后的每一位取反,最后加1。然后再对两个进行加法运算。对于结果,则需要进行判断,如果符号位为1,则表示负,需要对整个补码进行还原操作,即将符号位之后的每一位取反,最后加1。所以,有符号值范围是从-128到127。 综上所述,虽然74ls181不能自动区分有符号和无符号运算,但是在进行有符号运算时,需要进行一些转换操作。在计算机中,大多情况下使用的是补码进行有符号运算,因此我们需要对补码的计算方式有一定的了解。 ### 回答3: 74LS181是一种具有四个操作输入、功能选择输入和输出的16位算术逻辑单元(ALU)芯片。该芯片可以用于实现有符号和无符号运算。但是,其内部运算器无法区分有符号运算和无符号运算,需要外部信号对其进行控制。 在无符号运算中,值范围为0~65535,意味着它支持非负整运算。多情况下,这种运算器用于执行字操作,例如加、减、与、或等操作。 而在有符号运算中,其支持的值范围为-32768~32767,即包含负。比如,当两个有符号相加时,如果最高位的字(即符号位)出现1,那么就意味着它是个负,否则它是正。因此,如果需要执行有符号运算,其符号位需要先进行特殊处理。 两者的运算过程有所不同。在无符号运算中,运算过程与二进制的普通运算相同。但在有符号运算中,需要对操作进行符号扩展,即将符号位复制到其余位中去,以保证结果的正确性。 需要指出的是,在ALU芯片内部,并不提供除法、余和左移运算的电路,这些运算需要另外的电路来实现。另外,需要特别注意的是,使用32位微控制器时,必须使用两个74LS181运算器连接起来,才能实现完整的32位运算。 总之,74LS181组成的运算器可以用于执行有符号和无符号运算,但需要根据需要外部进行控制。无符号运算值范围为0~65535,而有符号运算值范围为-32768~32767,并且其符号位需要特殊处理以保证结果的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值