c语言中的定点整数使用“补码”存储的
void main(){
short x = -4321; //short占用2个字节 无符号数和有符号数 不改变数据内容 改变解释方式
unsigned short y = (unsigned short)x;

int a = 165537,b=-34991;        //int型占用4个字节        长整数变短整数 a = 0x000286a1    c = 0x86a1   真值-31071
short c = (short)a,    d = (short)b;                    高位截断 保留低位   b = 0xffff7751 d = 0x7751  真值30545

short x = -4321;                                  短整数变长整数 x = 1110 1111 0001 1111
int m =x;                                         符号扩展      m = ( 1111 1111 1111 1111 )1110 1111 0001 1111 真值-4321
unsigned short n = (unsigned short)x;                         n = 1110 1111 0001 1111 真值61215
unsigned int p = n;                                           p = 0000 0000 0000 0000 1110 1111 0001 1111真值61215

}

2-1-4-2零扩展和符号扩展!
短数据扩展为长数据
为什么要这样??
ALU位数是固定的,运算前可能需要把短数据扩展为常数据
通用寄存器的位数是固定的,把数据存入寄存器时,可能需要进行长度扩展

8bit扩展为16bit 多出来的那些位怎么填补
01011010 零扩展 00000000 01011010
10100110 00000000 10100110
零扩展适用于无符号整数 用0扩展高位

带符号整数(补码)90 0,1011010 0,00000000 1011010
带符号整数(补码)-90 1,0100110 1,11111111 0100110
符号拓展:适用于带符号整数(补码)用符号位扩展高位