第 12 题
C 语言代码如下:
int i = 32777;
short si = i;
int j =si;
执行上述代码段后,j 的 值 为 ( ) 。
A.-32777
B.-32759
C.32759
D.32777
[tag_link]
正确答案:B
int i=32777 ,赋值给 short 后,由于 short 只有 16 位,则只会保留 i 的低 16 位,同时,short 的上限为 2 15 − 1 即 32767,所以 32777 在 short 类型的变量中会出现数据溢出问题,32777=32767+9,则溢出后的二进制补码为 1000000000001001。再将此数转为 int,此时将进行符号扩展,补高 16 位的时候取决于当前 short 的符号位,若符号位为 1,则高 16 位补 16 个 1,若符号位为 0,则高 16 位补 16 个 0,所以本题补 16 个 1,结果为补码 1111 …. 1000 0000 0000 1001,换算成原码再计算,选 B。或者使用排除法,最终通过补码的最高位 1 可以断定该数为负数,A、B 里面选,32777 对于 short 已经溢出,转为 short 再符号扩展,并不只是单纯地改变子符号,故排除 A,选 B。