我正在考虑int的大小(有符号和无符号)。无符号整数的大小是非常明显的计算,但当它签署时我感到困惑..如果int是2个字节而第15个字节是用于符号那么它的大小是32767这是可以理解的..但当我试图计算-ve minimum i does this 1 1111111111111 ..(16个)。忽略有符号位(第16位),该值仍然是32767所以我得到范围+32767到-32767(这不是正确的范围)。 或者这可能不是计算范围的正确方法,因为编译器会将其视为-1。
那么如何计算+32767到-32768?
答案 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来实现数字的否定。因此,补充的数字0xFFFF
是0x0000
,并且加1得到{{ 1}}。因此,在二进制补码中,-1由所有位设置的二进制值表示。
最大正值有符号16位数为0x0001
,其负数表示为0x7FFF
。查看该负数,您可以看到,通过从该值中减去一个,我们得到一个更大幅度的负数:0x8001
。
所以,0x8000
和32767 = 0x7FFF
。