2.2 整数的表示
2.2.1 数据类型
不同数据类型的数值范围
- 在64位机器上,
long
占8个字节- 在32位机器上,
long
占4个字节
补码
负数是用补码表示的
补码最高位的权重是负的,所以称为符号位
最高位是灰色的负权重,所以最高位为1,就相当于减去8
例如:-5
表示为-8+3
,所以符号位是1
,非符号位是011
,即-5
的补码表示为1011
2.2.2 有符号数和无符号数
#include <stdio.h>
int main(int argc, char const *argv[])
{
short a = -12345;
unsigned short b = (unsigned short)a;
printf("a = %d, b = %u", a, b);
return 0;
}
// a = -12345, b = 53191
a
和b
的位模式其实是一样的,都是1100 1111 1100 0111
,但是解释这些位的方式不同
对于相同的位模式,有符号数和无符号数的转换关系为
所以
- 当最高位$x_{w-1}$为1时,此时有符号数$x$表示一个负数,要转换为无符号数需要加上$2^w$
- 当最高位为0时,有符号数和无符号数是相等的
无符号数到有符号数的转换
所以
- 最高位等于0时,无符号数可以表示的数值小于有符号数的最大值,此时转换后的数值不变
- 最高位等于1时,无符号数可以表示的数值大于有符号数的最大值,转换后得到的有符号数等于该无符号数减去$2^{w}$
例如:无符号数11D = 1011B
,转换为有符号数应该是$11-2^4=-5$
C语言中,执行运算时,如果一个运算数是有符号数,另一个运算数是无符号数,会将有符号数隐式转换为无符号数来执行运算
2.2.3 数据类型转换
数据扩展
- 无符号数的扩展高位补0
- 有符号数的扩展进行符号位扩展,最高位为0就扩展0,为1就扩展1
数据截断
对于十进制123456
,从中间截断得到456
,就相当于将原数对1000
取模,也就是对$10^3$取模
同理,将二进制数11001010
对$2^4$取模,就得到了1010