signed int的大小范围

时间:2013-09-28 06:46:05

标签: c range

我正在考虑int的大小(有符号和无符号)。无符号整数的大小是非常明显的计算,但当它签署时我感到困惑..如果int是2个字节而第15个字节是用于符号那么它的大小是32767这是可以理解的..但当我试图计算-ve minimum i does this 1 1111111111111 ..(16个)。忽略有符号位(第16位),该值仍然是32767所以我得到范围+32767到-32767(这不是正确的范围)。 或者这可能不是计算范围的正确方法,因为编译器会将其视为-1。

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

2 个答案:

答案 0 :(得分:0)

  

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

嗯,如果您的架构以与您相同的方式定义负范围,可以正确的范围:即,如果它使用"sign and magnitude"(或“符号和绝对值” “)代表。

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


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

这是正确的,因为所有15位都在变化(只有第0位,符号位保持不变,所以有2 ^ 15种可能的变化,如果你从-1开始,你将到达-32768。

答案 1 :(得分:0)

对于二进制补码表示,通过取数字的补码然后加1来实现数字的否定。因此,补充的数字0xFFFF0x0000,并且加1得到{{ 1}}。因此,在二进制补码中,-1由所有位设置的二进制值表示。

最大正值有符号16位数为0x0001,其负数表示为0x7FFF。查看该负数,您可以看到,通过从该值中减去一个,我们得到一个更大幅度的负数:0x8001

所以,0x800032767 = 0x7FFF