当前位置:   article > 正文

符号扩展与零扩展_零扩展和符号扩展

零扩展和符号扩展

符号扩展与零扩展


定义:

符号扩充

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

举个例子,若计算机使用六位二进制数表示数字“00 1010”(十进制的正10),且此数字需要将字长符号扩充至十六位,则扩充后的值为“0000 0000 0000 1010”。此时,数值与符号均保留了下来。

若计算机使用十位数及二补数表示数字“11 1111 0001”(十进制的负15),且此值需要扩充至十六位,则扩充后的值为“1111 1111 1111 0001”。 此时,负号及原数字数值通过将左侧填充为1的方式保留了下来。


零扩充

零扩展是与符号扩展类似的概念。在移动操作或转换操作中,零扩展指的是将目标的高位数设置为零,而不是将高位数设置成原数字的最高有效位。
即都补零。


何时使用零扩展,何时使用符号扩展:
当窄数据类型为:有符号数据类型时,扩展为宽数据类型时,使用符号扩展。
当窄数据类型为:无符号数据类型时,扩展为宽数据类型时,使用零扩展。

例如:

#include<stdio.h>
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;
 } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

unsigned short 做零扩展,所以 -3零扩展后的补码十六进制为 0000fffd,此时按%d有符号和%u无符号输出时,都一样,都是 65533。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号