(三)整数表示

来源:互联网 发布:基金推荐知乎 编辑:程序博客网 时间:2024/05/20 11:50

本节主要阐述整数在计算机中的表示方式:无符号数和有符号数。介绍其范围、编码方式,以及有无符号相互转换、数值扩展的原则。

整型数据类型

C语言中支持有符号整数和无符号整数。
1. 无符号整数表示范围即w位位向量能够表示的最大范围,例如unsigned char是一个字节表示,所以无符号数的表示范围为0~255。
2. 有符号数的有效位中,有一位是符号位,所以能表示的范围是无符号数的一半,而且由于0的符号位与正数一致,所以能表示的正数个数比负数个数少1。
3. 在不同字长的机器上,由于某些整型字节数不同,所以能表示的范围也不同。例如32位机器上的int和long int由于字节数相同,所以范围也相同,但是在64位机器上的long int所用字节是32位上的2倍,故所能表示的范围也大很多。
4. C语言标准定义了每种数据类型所能够表示的最小的取值范围。

整数编码

  • 无符号数:原码编码
  • 有符号数:补码编码

为什么要用补码来编码有符号数?
1. 对0具有唯一的编码(相对于原码和反码);
2. 位向量公式与原码几乎一致(除了首位解释为负权);
3. 可以直接进行布尔运算;

有符号数和无符号数的转换

  • 这种转换是位级别的转换,而不是数值的级别;
  • 强制类型转换的结果是保持位值不变

确定了这两点,就奠定了转换的基调。具体结果以4位为例:
先做几点说明:
- 4位二进制表示的有符号数范围为:-8 ~ 7,表示的无符号数范围为:0 ~ 16
- U2T表示无符号转化有符号,T2U表示有符号转化无符号(U为unsigned,T为two’s complementt,即补码)。
- 转换过程将以8为分界点,在0~8范围内的数,有符号和无符号都有相同的结果,例如4=B2U(4),5=B2U(5),但在这个范围以外的值,就需要加上或者减去16,负数转无符号数需要加16,大于等于8的无符号数转有符号数需要减去16。
转换结果如下面两张图所示:
这里写图片描述
这里写图片描述

数值扩展

这里的数值扩展和位移有点像,那有什么不同呢?
- 位移数运算,而数值扩展只是将一个较小的数据类型转化成一个较大的数据类型;
- 位移有向左位移、向右位移,而扩展顾名思义只有将小的扩展成大的一说;

扩展分两种:
- 0扩展:开头补0,即类似于位移中的逻辑位移;
- 符号扩展:开头补符号位,即类似于位移中的算术位移;

0 0