整数溢出的概念

时间:2015-05-20 21:04:35

标签: c++ c integer overflow

int溢出的工作原理。我的意思是问如果发生溢出,整数值的最终结果是什么?我需要在纸上理解它。就像我给出了一个多项选择题:

  

11 ^ 5产生:
  一个。 12个
  湾14
  C。 15
  d。 17.

我知道答案是(b)14,但想知道原因吗?

2 个答案:

答案 0 :(得分:5)

<bpel:variable name="counter" type="ns1:int">
    <bpel:from>1</bpel:from>
</variable>

<bpel:while name="While">
    <bpel:condition expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0">
        <![CDATA[]]>
    </bpel:condition>
    <bpel:assign validate="no" name="Assign2">
    </bpel:assign>
</bpel:while>

fyi,这与int溢出没有任何关系。

答案 1 :(得分:1)

因为你问的是环绕式,我正在回答下面的问题。但是从评论中可以清楚地看到,你真的尝试了C ++表达式11^5,这是一个等级XOR,并得到了答案14,这与环绕无关。如果它们是相同的值,则每对位的XOR结果为0,如果它们不同则为1。

现在,在下面的^表示取幂;这是一个常见的符号。

11 ^ 5 = 161051。

现在考虑使用16位来表示整数的情况,并且只有幅度,没有符号。即一个16位无符号C ++整数类型。然后有2 ^ 16个可能的位模式,它们编号为0到2 ^ 16 - 1,并代表这些数字。

161051大于该16位类型的最大可能值。如果它恰好是2 ^ 16,则它将对应于0(称为环绕),如果它是2 ^ 16 + 1,则它将对应于1,依此类推。所以它对应于161051 - 2 ^ 16。

现在如果反过来也大于2 ^ 16 - 1,你会重复这个过程。

这会产生整数除法的余数2 ^ 16。

基本上它只对应于删除除了16个最不重要的位之外的所有位。

顺便说一下,这个例子的结果不是你的任何选择(a),(b),(c)或(d)。