符号扩展与零扩展

定义:

符号扩充

符号扩充(又名符号扩展)是计算机算术中,在保留数字的符号(正负性)及数值的情况下,增加二进制数字位数的操作。

举个例子,若计算机使用六位二进制数表示数字“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。