1. 整数的扩展
当我们需要将一个较小的数据类型转换成一个较大的数据类型时,对于无符号数而言,我们只需要简单的进行零扩展(zero extension)就可,即只需要将要扩展的位填0就好了;而对于有符号数而言,我们就必须进行符号扩展了(sign extension)了,即将需要扩展的位全部填为当前的符号位。
eg. unsigned: [ x1 x2 x3 ... xn ] -> [ 0 0 0 ... 0 0 ... x1 x2 x3 ... xn ]
signed: [ x1 x2 x3 ... xn ] -> [ x1 x1 x1 ... x1 ... x1 x2 x3 ... xn ]
至于有符号数的扩展的证明,可参见二进制的表示方式和数学归纳法。
因此,我们要格外小心这些整数扩展而产生的问题,例如:
eg1.
- short sx = val; /* -12345 --- 0xCFC7 */
- unsigned short usx = sx; /* 53191 --- 0xCFC7 */
- int x = sx; /* -12345 --- 0xFFFFCFC7 */
- unsigned ux = usx; /* 53191 --- 0x0000CFC7 */
- unsigned uy = x; /* 4294954951 --- 0xFFFFCFC7 */
eg2.
- /* WARNING: This is buggy code */
- float sum_elements( float a[], unsigned length )
- {
- int i;
- float result = 0;
- for ( i = 0; i <= length - 1; i++ ) // error: 0U - 1 = max(32bit)
- result += a[i];
- return result;
- }
P54