我们在程序中看到的数字都是十进制值(加OX前缀或H后缀等修饰的数值除外),但在计算机底层它们都是以二进制的形式表示的。即用0和1来表示,对各种进制之间的转换不熟悉的可以看看,进制转换 和 举例说明
有符号数
- c语言中,数值分为有符号数(signed) 和 无符号数(unsigned),有符号数区分正数和负数,无符号数只有正数,程序中如果不通过unsigned指定(如unsigned int x 来指定x为无符号数),则x默认为有符号数。
- 那么问题来了,有符号数 区分正数和负数,仅用0和1如何表示呢? [ 以8位的二进制为例 ]
原来,计算机中规定了,用有符号数二进制的最高位(二进制最左边的位是最高位,如红1和红0)来区分正负数,最高位是0则为正数,是1则为负数。所以在有符号数中,二进制的最高位被称为符号位

讯享网
例如下面有符号二进制数对应的十进制值:
- 1 1 1 1 1 1 1 1 : − 2 7 -2^{7} −27 + 2 6 2^{6} 26 + 2 5 2^{5} 25 + 2 4 2^{4} 24 + 2 3 2^{3} 23 + 2 2 2^{2} 22 + 2 1 2^{1} 21 + 2 0 2^{0} 20 = -1
- 1 0 0 1 0 1 0 0 : − 2 7 -2^{7} −27 + 0 0 0 + 0 0 0 + 2 4 2^{4} 24 + 0 0 0 + 2 2 2^{2} 22 + 0 0 0 + 0 0 0 = -108
- 0 1 0 1 1 0 0 1 : 0 0 0 + 2 6 2^{6} 26 + 0 0 0 + 2 4 2^{4} 24 + 2 3 2^{3} 23 + 0 0 0 + 0 0 0 + 2 0 2^{0} 20 = 89

从中可看出:
- ① 一个负数,其二进制数的最高位一定是1
- ② 有符号数最高位,不仅有符号位的意思,还有权重的意思。

- ③ 除了最高位是1,其余位均为0时,有符号数取得最小值 min = − 2 7 -2^{7} −27 + 0 0 0 + 0 0 0 + 0 0 0 + 0 0 0 + 0 0 0 + 0 0 0 + 0 0 0 = − 2 7 -2^{7} −27, 即: − 2 w − 1 -2^{w-1} −2w−1
- ④ 最高位是0,其余位均为1时,有符号数取得最大值 max = 2 6 2^{6} 26 + 2 5 2^{5} 25 + 2 4 2^{4} 24 + 2 3 2^{3} 23 + 2 2 2^{2} 22 + 2 1 2^{1} 21 + 2 0 2^{0} 20 = 2 7 − 1 2^{7}-1 27−1, 即: 2 w − 1 − 1 2^{w-1}-1 2w−1−1
故,有符号数的取值范围是:[ − 2 w − 1 -2^{w-1} −2w−1 , 2 w − 1 − 1 2^{w-1}-1 2w−1−1] ,w是二进制位数,比如上面的二进制数是8位,数据类型int是32位(4字节)
无符号数
- 无符号类型 需通过unsigned关键字指定(如:unsigned int x;),否则默认为有符号数。[Java中没有无符号类型]

无符号数,最高位表示权重,没有符号位之意。所以无符号数都是大于等于0的数。无符号数的取值范围是:[ 0, 2 w − 1 2^{w}-1 2w−1]
例如下面有符号二进制数对应的十进制值:
- 1 1 1 1 1 1 1 1 : 2 7 2^{7} 27 + 2 6 2^{6} 26 + 2 5 2^{5} 25 + 2 4 2^{4} 24 + 2 3 2^{3} 23 + 2 2 2^{2} 22 + 2 1 2^{1} 21 + 2 0 2^{0} 20 = 2 8 − 1 2^{8}-1 28−1

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/23833.html