一.赋值语句及执行过程
<1>赋值语句
赋值表达式后面加一个分号,就是赋值语句,格式如下:
变量=表达式 ;//有分句,是赋值语句
赋值号左侧通常是变量,右侧通常是一个表达式,但也可以是常量或者变量
<2>赋值的执行过程
赋值时,赋值号右侧表达式的值要先计算出结果,并且要在运算器中把这个结果处理成想应的格式(若是整数,则为补码表示),最后才存给变量。赋值的最后一步操作,就是把计算机从运算器写到内存变量中。
二.赋值的几种数据处理方式
<1>变量和表达式结果的长度相同,则原样复制
若变量和表达式结果所占字节数相同,则之际把表达式结果的存储状态(已经在运算器中处理成相应格式的二级制数据了)原样复制到内存变量中。例如:
int a;short b;unsigned short c=65535;a=200/2;b=c;printf("%d,%hd\n",a,b);
运行结果:100,-1
【程序解析】
执行“a=200/2”;时,先计算200/2得到100,因为100是整数,故这个结果要在运行器中处理成编码00000000 00000000 00000000 01100100,而变量a在内存中也恰好也是存补码,且长度也是4个字节,所以就直接把这个补码原样搬到a的4个字节中。
赋值的处理方式(原样赋值)
<2>若变量比表达式结果“短”,则只截取低位部分
若表达式结果所占字节数比变量多,则只截取低字节部分存给变量,多余的字节丢弃(溢出),例如:
short a,b;int c=-1;a=65536;b=c;printf("%hd,%hd\n",a,b);
运行结果:0,-1
【程序解析】
对于“a=65536”一行,因65536是整数(默认为int类型),其补码是4个字节:00000000 00000001 00000000 00000000,而变量a只有两个字节的内存空间,只能存16位,故截取低位2个字节(16个0)存储,高位两个字节丢弃(溢出)
赋值的处理方式(截取)
<3>若变量比表达式结果“短”而变量“长”,则一般要进行符号扩展
若是表达式结果“短”而变量“长”,则一般进行符号扩展,例如:
long a,b;short c=1,d=-1;char e='A';a=c;//符号扩展,c的符号位是0,所以用0填充a的两个高位字节b=d;//符号扩展,d的符号位是1,所以用1填充b的两个高位字节c=e;//是否符号扩展?printf("%ld,%ld,%hd\n",a,b,c);
运行结果:1,-1,65
【程序解析】
程序中“a=c;”和“b=d”,都是把2字节的“短”数据赋值给4字节的“长”变量,赋值时,系统首先把“短”数据的两个字节原样复制到“长”变量的低位上,“长”变量高位的两个字节,则用“短”数据的符号位(即最高位)填满。
赋值的处理方式 (符号扩展)