信息的表示与存储 - 整数的表示

用户头像
引花眠
关注
发布于: 2020 年 06 月 01 日

整数的表示

在数学中可以表示的数字是没有极限的,但是在计算机中如果使用特定的整数数据类型来表示数字,那么是有范围的。计算机对数字的表示分为两块:整数与浮点数,接下来我们先介绍整数,下表列出32位C语言程序中典型整数类型的存储大小和值范围的细节:

类型存储大小值范围char1 字节-128 ~ 127unsigned char1 字节0 ~ 255short2 字节-32768 ~ 32767unsigned short2 字节0 ~ 65535int4 字节-2147483648 ~ 2147483647unsigned int4 字节0 ~ 4294967295long4 字节-2147483648 ~ 2147483647unsigned long4 字节0 ~ 4294967295

不同的整数类型,存储长度有区别,表示的值范围也不同,有的能够表示负数(“有符号”),有的不能(“无符号”)。

无符号整数

对于一个w位的无符号整数,用二进制比特位可以表示为[xw-1, xw-2, … , x2, x1, x0],如果我们用函数(Binary to Unsigned的缩写,w表示二进制比特的位数)来表示比特位到非负数的映射,那么可以得到:



无符号整数的最大值UMax _w =2^w-1,所以unsigned char的最大值是

有符号整数

有符号整数有几种表示方式,比如原码、反码、补码,其最高位为都是符号位(0 + , 1 -),其他位为数据位。

当值为正数时,原码、反码、补码符号位都是0,其所有的编码方式和原码相同,

当值为负数时,原码、反码、补码符号位都是1,但是其他二进制位表示不一致。

  1. 反码表示为所有数据位取反表示(符号位不变)

  2. 其补码表示为所有数据位取反加1(符号位不变)

比如:,

一般在计算机内部,有符号整数用补码(two’s complement)表示,对于一个w位的整数,用二进制比特位可以表示为[xw-1, xw-2, … , x2, x1, x0],如果我们用函数(Binary to two’s complement的缩写,w表示二进制比特的位数)来表示比特位到整数的映射,那么可以得到:



补码可表示的数据范围是:[100…000]~[011…1111],由该公式可以得出

为什么要用补码表示负数

这主要是因为,计算机实现加法运算是很容易的,若直接作减法则比较复杂,需要处理借位等等,内部逻辑组件会增多,所以如果将减法转换为加法则实现会容易,比如7-3=7+(-3)=4,用8位来表示二进制。

  • 如果直接使用原码表示负数,则7+(-3)可表示为:

结果是 -10 ,这显然不符合我们的预期。

  • 如果使用反码表示,则7+(-3)可表示为:

相加丢弃进位,结果是 2,这显然不符合我们的预期。



  • 如果使用补码表示负数,则7+(-3)可表示为:

相加丢弃进位,结果是 4,正好符合预期。



用原码和反码表示负数,还有一个问题,+0、-0问题,按照原码的概念来算,原码0000 0000的表示+0 ,原码 1000 0000表示 -0 ,如果遇到0的计算,是应该用 +0 还是用 -0 计算呢,这就会产生分歧,并且因为+0、-0,原码和反码只能表示-127~127。

如果用补码就没有+0、-0问题,在补码10000000表示-128,所以补码的表示范围是-128~127。



发布于: 2020 年 06 月 01 日 阅读数: 19
用户头像

引花眠

关注

还未添加个人签名 2018.06.11 加入

还未添加个人简介

评论

发布
暂无评论
信息的表示与存储-整数的表示