题目

想要看懂这段节目,首先我们要知道一些计算机专业的背景知识。
计算机里的“类型”是什么意思?
在 C 语言里面,每种数据类型都有“大小”和“有没有符号”的区别。
(a) Short 是 2 个字节(约 16 位)
(b) Int 是 4 个字节(约 32 位)有符号与无符号的区别:
(a) Signed(有符号):能存整数和负数,用补码进行表示
(b) Unsigned(无符号):只能存正数,但表示的范围会更大
听我说的,这个 si 等于 -32767,它是一个 short 类型的数据。
因为计算机存负数的时候是补码,所以我们首先需要把这个正数 32767 的 16 位二进制写出来。实际上就是:0111 1111 1111 1111(第一位是 0,剩下的位全都是 1)。
这个时候,如果它想存负数的话,全部位取反,再加 1。最后,就得到了 si 在内存里面的 16 位补码。
1000 0000 0000 0001
符号扩展(因为位数从16变32,必须补齐高位)
看最高位是1(表示负数),就在左边补满16个1。
变成32位:1111 1111 1111 1111 1000 0000 0000 0001
那串全是1的高16位 + 低16位的0x8001,
相当于: 2³² - 32767 而32767 = 2¹⁵ - 1
所以: 2³² - (2¹⁵ - 1) = 2³² - 2¹⁵ + 1 → 正好是D选项!