有符号数和⽆符号数
1、你⾃已决定是否需要有正负。
就像我们必须决定某个量使⽤整数还是实数,使⽤多⼤的范围数⼀样,我们必须⾃已决定某个量是否需要正负。如果这个量不会有负值,那
么我们可以定它为带正负的类型。
在计算机中,可以区分正负的类型,称为有符类型(signed),⽆正负的类型(只有正值),称为⽆符类型。(unsigned)数值类型分为
整型或实型,其中整型⼜分为⽆符类型或有符类型,⽽实型则只有符类型。字符类型也分为有符和⽆符类型。⽐如有两个量,年龄和库
存,我们可以定前者为⽆符的字符类型,后者定为有符的整数类型。
2、使⽤⼆制数中的最⾼位表⽰正负。
⾸先得知道最⾼位是哪⼀位?1个字节的类型,如字符类型,最⾼位是第7位,2个字节的数,最⾼位是第15位,4个字节的数,最⾼位是第
31位。不同长度的数值类型,其最⾼位也就不同,但总是最左边的那位(如下⽰意)。字符类型固定是1个字节,所以最⾼位总是第7位。
(红⾊为最⾼位)
单字节数:11111111
双字节数:11111
四字节数:1111111111
当我们指定⼀个数量是⽆符号类型时,那么其最⾼位的1或0,和其它位⼀样,⽤来表⽰该数的⼤⼩。
当我们指定⼀个数量是⽆符号类型时,此时,最⾼数称为“符号位”。为1时,表⽰该数为负值,为0时表⽰为正值。
3、⽆符号数和有符号数的范围区别。
⽆符号数中,所有的位都⽤于直接表⽰该值的⼤⼩。有符号数中最⾼位⽤于表⽰正负,所以,当为正值时,该数的最⼤值就会变⼩。我们举
⼀个字节的数值对⽐:
⽆符号数:11111111值:255
1*27+1*26+1*25+1*24+1*23+1*22+1*21+1*20
有符号数:01111111值:127
1*26+1*25+1*24+1*23+1*22+1*21+1*20
同样是⼀个字节,⽆符号数的最⼤值是255,⽽有符号数的最⼤值是127。原因是有符号数中的最⾼位被挪去表⽰符号了。并且,我们知
道,最⾼位的权值也是最⾼的(对于1字节数来说是2的7次⽅=128),所以仅仅少于⼀位,最⼤值⼀下⼦减半。
不过,有符号数的长处是它可以表⽰负数。因此,虽然它的在最⼤值缩⽔了,却在负值的⽅向出现了伸展。我们仍⼀个字节的数值对⽐:
⽆符号数:0-----------------255
有符号数:-128---------0----------127
同样是⼀个字节,⽆符号的最⼩值是0,⽽有符号数的最⼩值是-128。所以⼆者能表达的不同的数值的个数都⼀样是256个。只不过前者
表达的是0到255这256个数,后者表达的是-128到+127这256个数。
⼀个有符号的数据类型的最⼩值是如何计算出来的呢?
有符号的数据类型的最⼤值的计算⽅法完全和⽆符号⼀样,只不过它少了⼀个最⾼位(见第3点)。但在负值范围内,数值的计算⽅法不能
直接使⽤1*26+1*25的公式进⾏转换。在计算机中,负数除为最⾼位为1以外,还采⽤补码形式进⾏表达。所以在计算其值前,需要对
补码进⾏还原。
这⾥,先直观地看⼀眼补码的形式:
在10进制中:1表⽰正1,⽽加上负号:-1表⽰和1相对的负值。
那么,我们会很容易认为在2进制中(1个字节):00000001表⽰正1,则⾼位为1后:10000001应该表⽰-1。
然⽽,事实上计算机中的规定有些相反,请看下表:
⼆进制值(1字节)⼗进制值
10000000-128
10000001-127
10000010-126
10000011-125
…………
11111110-2
11111111-1
⾸先我们看到,从-1到-128,其⼆进制的最⾼位都是1,正如我们前⾯的学。负数最⾼为为1
然后我们有些奇怪地发现,10000000并没有拿来表⽰-0;⽽10000001也不是拿来直观地表⽰-1。事实上,-1⽤11111111来表
⽰。
怎么理解这个问题呢?先得问⼀句是-1⼤还是-128⼤?
当然是-1⼤。-1是最⼤的负整数。以此对应,计算机中⽆论是字符类型,或者是整数类型,也⽆论这个整数是⼏个字节。它都⽤全1来表
⽰-1。⽐如⼀个字节的数值中:11111111表⽰-1,那么,11111111-1是什么呢?和现实中的计算结果完全⼀致。11111111-
1=11111110,⽽11111110就是-2。这样⼀直减下去,当减到只剩最⾼位⽤于表⽰符号的1以外,其它低位全为0时,就是最⼩的负
值了,在⼀字节中,最⼩的负值是10000000,也就是-128。
我们以-1为例,来看看不同字节数的整数中,如何表达-1这个数:
字节数⼆进制值⼗进制值
单字节数11111111-1
双字节数11111-1
四字节数1111111111-1
可能有同学这时会混了:为什么11111111有时表⽰255,有时⼜表⽰-1?所以我再强调⼀下前⾯所说的第2点:你⾃已决定⼀个数是有
符号还是⽆符号的。写程序时,指定⼀个量是有符号的,那么当这个量的⼆进制各位上都是1时,它表⽰的数就是-1;相反,如果事选声明
这个量是⽆符号的,此时它表⽰的就是该量允许的最⼤值,对于⼀个字节的数来说,最⼤值就是255。
我们已经知道计算机中,所有数据最终都是使⽤⼆进制数表达。也已经学会如何将⼀个10进制数如何转换为⼆进制数。不过,我们仍然
没有学习⼀个负数如何⽤⼆进制表达。
⽐如,假设有⼀int类型的数,值为5,那么,我们知道它在计算机中表⽰为:
00000101
5转换成⼆制是101,不过int类型的数占⽤4字节(32位),所以前⾯填了⼀堆0。现在想知道,-5在计算机中如何表⽰?在计算机中,
负数以其正值的补码形式表达。
什么叫补码呢?这得从原码,反码说起。
原码:⼀个整数,按照绝对值⼤⼩转换成的⼆进制数,最⾼为为符号位,称为原码。红⾊为符号位
⽐如00000101是5的原码。
10000101是-5的原码
反码:将⼆进制除符号位数按位取反,所得的新⼆进制数称为原⼆进制数的反码。正数的反码为原码,负数的反码是原码符号位外按位取
反。
取反操作指:原为1,得0;原为0,得1。(1变0;0变1)
正数:正数的反码与原码相同。
负数:负数的反码,符号位为“1”,数值部分按位取反。
⽐如:将10000101除符号位每⼀位取反,
得1111111010。
称:1111111010是10000101的反码。
反码是相互的,所以也可称:
1111111010和10000101互为反码。
补码:反码加1称为补码。
正数:正数的补码和原码相同。
负数:按照规则来
也就是说,要得到⼀个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
1111111010是10000101(-5)的反码。
加1得1111111011
所以,-5在计算机中表达为:1111111011。转换为⼗六进制:0xFFFFFFFB。
再举⼀例,我们来看整数-1在计算机中如何表⽰。
假设这也是⼀个int类型,那么:
1、先取-1的原码:10000001
2、除符号位取反得反码:1111111110
3、加1得补码:1111111111
可见,-1在计算机⾥⽤⼆进制表达就是全1。16进制为:0xFFFFFF。
计算机中的带符号数⽤补码表⽰的优点:
1、负数的补码与对应正数的补码之间的转换可以⽤同⼀种⽅法——求补运算完成,可以简化硬件;
2、可将减法变为加法,省去减法器;
3、⽆符号数及带符号数的加法运算可以⽤同⼀电路完成。
可得出⼀种⼼算求补的⽅法——从最低位开始⾄找到的第⼀个1均不变,符号位不变,这之间的各位“求反”(该⽅法仅⽤于做题)。
⽅法例1例2
1.从右边开始,找到第⼀个'1'1100
2.反转从这个'1'之后开始到最左边(不包括符号位)的所有位1100
本文发布于:2022-12-02 16:46:56,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/39015.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |