C语言中的整数类型及类型转换
c语言中数字以补码形式进行运算和存储,下面提到的类型转换的规则都是针对补码进行.
short x=-4321;//short型占用2个字节
unsigned short y=(unsigned short) x;
无符号数与有符号数:不改变数据内容,改变解释方式。
x的补码为:1110 1111 0001 1111
y的补码为:1110 1111 0001 1111
改变解释方式之后,最高位的1不代表符号,而是参与到计算,此时y的值为61215
int a=165537,b=-34991;//int型占用4个字节
short c=(short) a,d=(short) b;//short型占用2个字节
长整数变短整数:高位截断,保留低位。
short x=-4321;
int m=x;
unsigned short n=(unsigned short)x;
unsigned int p=n;
短整数变长整数:符号扩展。
在高位补充符号位,例如符号位是1,在高位全部补充1,符号位是0,在高位全部补充0.
零扩展、符号扩展
- ALU的位数是固定的,运算前可能需要把短数据扩展为长数据
- 通用寄存器位数是固定的,把数据存入寄存器时,可能需要进行长度扩展
- 主存内的各种数据长度不一,有时需要把短数据扩展为长数据
有时寄存器和运算的数据位数不同,所以需要将数据扩展运算位宽. - 零扩展:适适用于无符号整数,用0扩展高位
- 符号扩展:适用于带符号整数(补码),用“符号位”扩展高位