计算机系统·整数表示

信息的表示和处理

在这里插入图片描述

整数表示

C语言支持多种整型数据类型,例如int,long int,unsigned int,这些关键字可以用来指定不同类型数据的大小
64位机器不同的数据类型表示数值的范围,不同的数据类型所占的字节数是不同的,这是导致数值取值范围不同的直接原因。(long unsigned 的取值范围与机器字长有关,64位long占8个字节,32位long占四个字节;非负数就是无符号数)在这里插入图片描述

无符号数(Unsigned Encoding)

编码:对于整数的数据类型有w位,用向量x表示。
把向量x用二进制表示的数,向量x中的每一位表示一个二进制位,取值分别位0或1,用一个函数B2U(Binary to Unsigned)来计算一个二进制串如何转换成一个无符号数在这里插入图片描述

两个例子在这里插入图片描述

图形化的表示方法来理解编码规则:
对于向量的第i位用一个2^i的蓝色条状图表示,每个“位向量”对应的值=所有位的值为1的累和
例如:0001,0101,1011,1111在这里插入图片描述

问题:只能表示非负数,负数如何编码?

有符号数补码(Two’s Complation Endcodings)

对于采用补码方式进行编码的二进制数与有符号数的转换如图所示在这里插入图片描述

注意:最高位是符号位,为1时表示负数,为0时表示负数

负权重

0101和1011对应的有符号数的具体计算过程如图所示
在这里插入图片描述

图形化表示方法:
灰色条状图用来表示符号位为1的情况在这里插入图片描述

四位补码的表示范围[-8 , 7]

无符号数最大取值(Unsigned Maximum)

当所有二进制位为1时,表示最大值在这里插入图片描述

有符号数的最大值(Signed Maximum)

最高位等于0,其他位均为1时,表示相应字长的最大值在这里插入图片描述

有符号数的最小值(Signed Minimum)

最小值,符号位为1,其他位等于0在这里插入图片描述

对于-1,无论是多少位的字长,有符号数-1的补码是一个全为1的串
Error : 1000 0001,虽然C语言中没有要求要用补码来表示有符号数,但几乎所有的机器都是用补码来表示有符号数
补码的表示例子:对于相同的串,映射函数不同,得到的数值也不同在这里插入图片描述

无符号数与有符号数间的转换(Conversation between Signed and Unsigned)

C语言允许数据类型之间做强制类型转换
例子:short int a转换成unsigned short b
在这里插入图片描述

在十进制模式下,两者之间似乎没有关系,但是在二进制表示里,两者的位模式相同
C语言中有符号数和无符号数的转换规则:位模式不变,但是解释方式改变

二进制补码转换为无符号数(Two’s complement to Unsigned)

无符号数和有符号数的映射关系如图所示
在这里插入图片描述
将两者做差,结果即为两者数值的差异,对差进行移项,即得到无符号数与有符号数间的数值关系和映射函数如图所示
在这里插入图片描述
在无符号数转换成有符号数中,无符号数表示的数可能大于有符号数的最大值,在这种情况下的得到的有符号数是该无符号数减去2^w,T2U和U2T两个函数映射关系体现了有符号数和无符号数转换的数值关系。

较小数据类型转换成较大数据类型(Expanding the BIt Representation of a Number)
无符号数扩展

将无符号数转换成一个更大的数据类型,例如:将unsigned char a 转换成一个 unsigned short b ,变量a占8 bits,变量b占16 bits,对于无符号数的转换只需要在扩展的数位补0,将这种运算称为0扩展,如图所示
在这里插入图片描述

有符号数扩展(Sign Extension)

将有符号数转换成一个更大的数据类型,例如:将char a 转换成一个 short b
符号位扩展:

  • 当有符号数表示整数时,最高位是0,此时扩展的数位进行补0操作即可
  • 当无符号数表示整数时,最高位是1,此时扩展的数位需要进行补1
    在这里插入图片描述
数学证明:

对于一个w位的有符号数,用B2Tw表示,扩展k位,扩展后的有符号数用B2Tw+k表示在这里插入图片描述
证明过程:

  1. 将问题 B 2 T w = = B 2 T w + k B2Tw==B2Tw+k B2Tw==B2Tw+k 转换为证明 B 2 T w = = B 2 T w + 1 B2Tw==B2Tw+1 B2Tw==B2Tw+1
  2. 求出两个扩展式,再将二者做差,得到表达式在这里插入图片描述
较大数据类型转换成较小数据类型(Truncaing Numbers)

例如:将int 类型转换成short类型,int的高16位数据丢弃,留下低16位数据,因此截断一个数据可能会改变他原来的数值
在这里插入图片描述

截断无符号数(Truncating unsigned number)

将一个w位的无符号数截断成k位时,丢弃最高的w-k位,相当于取模运算
在这里插入图片描述

截断有符号数(Truncating signed number)

过程:

  1. 用无符号数的函数映射来解释底层的二进制位,用无符号数的截断来求出k位
  2. 将无符号数转换成有符号数,得到截断后的值
    在这里插入图片描述

有符号数和无符号数之间的转换会导致一些非直观结果,从而导致难以发现的错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值