符号扩展与零扩展
符号扩展与零扩展
定义:
符号扩充
符号扩充(又名符号扩展)是计算机算术中,在保留数字的符号(正负性)及数值的情况下,增加二进制数字位数的操作。
举个例子,若计算机使用六位二进制数表示数字“00 1010”(十进制的正10),且此数字需要将字长符号扩充至十六位,则扩充后的值为“0000 0000 0000 1010”。此时,数值与符号均保留了下来。
若计算机使用十位数及二补数表示数字“11 1111 0001”(十进制的负15),且此值需要扩充至十六位,则扩充后的值为“1111 1111 1111 0001”。 此时,负号及原数字数值通过将左侧填充为1的方式保留了下来。
零扩充
零扩展是与符号扩展类似的概念。在移动操作或转换操作中,零扩展指的是将目标的高位数设置为零,而不是将高位数设置成原数字的最高有效位。
即都补零。
何时使用零扩展,何时使用符号扩展:
当窄数据类型为:有符号数据类型时,扩展为宽数据类型时,使用符号扩展。
当窄数据类型为:无符号数据类型时,扩展为宽数据类型时,使用零扩展。
例如:
#include
int main()
{
unsigned short abc=2;
abc=abc-5;
printf("%d\n",abc);//输出 65533
printf("%u\n",abc); //输出 65533
printf("%x\n",abc); //输出 fffd
unsigned int ab = 2;
ab = ab - 5;
printf("%d\n",ab); //输出 -3
printf("%u\n",ab);// 输出 4294967293
printf("%x\n",ab); //输出 fffffffd
return 0;
}
unsigned short 做零扩展,所以 -3零扩展后的补码十六进制为 0000fffd,此时按%d有符号和%u无符号输出时,都一样,都是 65533。