0

我在考虑 int 的大小(有符号和无符号)。无符号整数的大小很容易计算,但是当涉及到有符号时,我感到困惑..如果 int 是 2 个字节,第 15 个字节是符号,那么它的大小是 32767,这是可以理解的.. 但是当我尝试计算-ve 至少我做了 1 1111111111111 ..(16 个)。忽略有符号位(第 16 位),值仍然是 32767,所以我得到范围 +32767 到 -32767(这不是正确的范围)。或者这可能不是计算范围的正确方法,因为编译器会将其视为 -1。

那么 +32767 到 -32768 是如何计算的?

4

2 回答 2

0

对于二进制补码表示,数字的取反是通过取数字的补码然后加 1 来实现的。因此,0xFFFF补码为0x0000,加 1 产生0x0001。所以在二进制补码中,-1 由所有位设置的二进制值表示。

最大的正符号 16 位数字是0x7FFF,它的负表示是0x8001。查看该负数,您可以看到通过从该值中再减去一个,我们得到一个更大数量级的负数:0x8000

所以32767 = 0x7FFF, 和-32768 = 0x8000

于 2013-09-28T06:56:10.343 回答
0

但是当我试图计算 -ve 最小值时,我做了这个 1 1111111111111 ..(16 个)。忽略有符号位(第 16 位),值仍然是 32767,所以我得到范围 +32767 到 -32767(这不是正确的范围)

好吧,如果您的架构以与您相同的方式定义负范围,那么它可能是正确的范围:也就是说,如果它使用“符号和幅度”(或“符号和绝对值”)表示。

这是完全有效的:在 C 中,有符号整数不一定使用 2 的补码表示(正如您所假设的那样)。


但是,如果您的平台确实使用了 2 的补码,那么您计算最小负值的方法是不正确的。然后你必须倒数,1111 1111 1111 1111(-1),直到1000 0000 0000 0000,结果是-32768。

这是真的,因为所有 15 位都在变化(只有第 0 位,符号位保持不变,如您所见),因此2 ^ 15可能存在变化,如果从 -1 开始,您将到达 -32768。

于 2013-09-28T06:49:56.287 回答