C 有符号整数的大小范围

C 有符号整数的大小范围,c,range,C,Range,我在考虑int的大小(有符号和无符号)。无符号整数的大小很容易计算,但说到有符号整数,我就糊涂了。。比如,如果int是2个字节,第15个字节是符号,那么它的大小是32767,这是可以理解的。。但是当我试图计算-ve最小值时,我做了1111111111111..(16个)。忽略有符号位(第16位),值仍然是32767,所以我得到了范围+32767到-32767(这不是正确的范围)。 或者,这可能不是计算范围的正确方法,因为编译器将其视为-1 那么+32767到-32768是如何计算的呢 但是当我试

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

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

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

嗯,如果您的体系结构以与您相同的方式定义负范围:即,如果它使用(或“符号和绝对值”)表示,那么它可以是正确的范围

这是完全正确的:在C中,有符号整数不必用2的补码来表示(正如您所假设的)


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


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

对于两个补码表示,一个数的求反是通过取该数的补数,然后加1来实现的。因此,数字
0xFFFF
被补为
0x0000
,加1得到
0x0001
。所以在两个补码中,-1由所有位集的二进制值表示

最大正符号16位数字为
0x7FFF
,其负表示为
0x8001
。看看这个负数,你可以看到,从这个值中再减去一个,我们得到一个更大量级的负数:
0x8000


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

它应该如何数学计算您的机器可能使用了两个补码表示法。@jxh是的,这不是OP要问的。问题:这些有多少个整数:
-1到1
-32767至+32768
-32767至+32767
?@P0W这也不是一个“排他与包含区间边界”问题。OP对2的补码是如何表示的有一个错误的假设。所以通过这个逻辑,我可以得到更多的负数。。。只需继续减去1,除非位用完,否则会出现有符号整数溢出,从而导致未定义的行为。但是,在一般情况下(也就是说,从数学上讲),这就是如何形成更大数量级的连续负数。你减去1。或者它可以是这样的……在正的一面0-32767(32768个数字),所以同样数量的数字也会在负的范围内。32767=0111 1111 1111 1111. 现在-32767=(它将在2的completent中)1000 0000 0001。在反面-1到-32767=32767个数字,因此会有一个更多的数字是-32768,两边的数字数量相同。如果我正确理解了你的评论,你就正确理解了我的答案。你经常会在
中看到一个两补系统,
INT\u MIN
被定义为
(-INT\u MAX-1)