栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c语言中的有符号数(signed)和无符号数(unsigned)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c语言中的有符号数(signed)和无符号数(unsigned)


我们在程序中看到的数字都是十进制值(加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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/456948.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号