有如下C语言程序段
short si = -32767; unsigned short usi = si;
执行上述两条语句后,usi的值为( )。
A. -32767
B. 32767
C. 32768
D. 32769
short型占4B也就是16bit,65535 = 2^16 - 1 = 65536 - 1,机器码(补码)表示为FFFFH
将usi赋值给带符号short变量si,机器码表示为FFFFH(最高位符号位为1,负数),剩下的15位均为1,那么表示的是 - ( 2^15 - 1 ) = - 32767 (注:2^15 = 32768)
-32767的15位数值表示的补值是-1,那么si表示的值为-1。
看到65535,要能知道2^16 = 65536
所以unsigned short usi=65535;// 1111 1111 1111 1111
方法一:二进制计算
C语言中...
用户登录可进行刷题及查看答案
C语言中的数据在内存中为补码表示形式,short为有符号短整型,占16位,si = -32767 = -(32768-1),[si]原 = 1111 1111 1111 1111B,[si]补 = 1000 0000 0000 0001B。
第2行代码进行了强制类型转换,由signed型转化为等长unsigned型数据时,符号位成为数据的一部分,usi = [si]补 = 1000 0000 0000 0001B = 2^15+1 = 32768 + 1 = 32769。
本题选D。
方法二:十进制计算
short为有符号短整型,占16位,表示范围为 −2^15∼2^15−1 ,即-32768~32767。
unsigned short为无符号短整型,占16位,表示范围为 0∼2^16−1 ,即0~65535。
short和unsigned short均占16位,表示范围大小均为 2^16=65536 。
-32767对于unsigned short负越界,正向偏移一个表示范围大小,即偏移 2^16=65536 ,得到-32767+65536=32769。
登录后提交答案