有关计算机运行时的零扩展和符号扩展与移位运算的总结
计算机编程中的一种常见运算就是不同类型之间的转换(即位级别的转换)。在转换之时我们要保证被转换的数值保持不变,否则,就有可能发生数值溢出。当然,从较大的数据类型(比如long)转换到较小的数据类型(如short),这根本是不可能的,这样很可能会发生溢出,但是,从一个较小的数据类型转换到较大的数据类型,是可能的。当我们将一个较小数据类型执行零扩展(zero extension)至一个较大的数据类型时,系统只是简单的在数据的开头添加0,当我们将一个较小的数据执行符号扩展(sign extension)时,系统会在数值中添加最高有效位的值的副本。
举个例子,现在有一个16位的short int的数据为0xc345
当系统执行零扩展至32位int时,该数据就变成0x0000c345
当系统执行符号扩展至32位int时,该数据就变成了0xffffc345(因为c的首位为1)
计算机中移位运算分为两大类:左移位和右移位运算。计算机中的左移位运算规则是数值向左移动k位,舍弃最高的k位,并在右端补k个0。而计算机一般支持两种右移运算:逻辑右移和算数右移。逻辑右移在左端补k个0,算数右移在左端补k个最高有效位的值。比如说,
x=01101100
x<<4 11000000
x>>4(逻辑右移) 00000110
x<<4(算数右移) 00000110
x=11101100
x<<4 11000000
x>>4(逻辑右移) 00001110
x<<4(算数右移) 11111110

浙公网安备 33010602011771号