【问题标题】:Integer overflow concept整数溢出概念
【发布时间】:2015-05-20 21:04:34
【问题描述】:

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

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

我知道答案是(b)14,但想知道为什么?

【问题讨论】:

  • 支持我认为人们寻求对事物的解释是件好事。
  • 大多数架构使用单个位作为 sign,并用1's 填充。
  • 看看here
  • MCQ?现在的 TLA 太多了……
  • 11 ^ 5 --> 14(十进制)--> 1011 xor 0101 --> 1110(二进制)。不涉及溢出。

标签: c++ c integer overflow


【解决方案1】:
   DecVal   BinVal
    11   -> 1011
XOR 5    -> 0101
           -------
    14   -> 1110

fyi,这实际上与 int 溢出无关。

【讨论】:

  • 是的,答案就在这里。谢谢先生,您解决了我的问题。
  • @MohsinAli 这怎么是你多次坚持的溢出问题?
  • 看先生,我对所有这些都是新手,我想如果没有别的,那就是溢出问题。
  • @MohsinAli 这是一个 XOR ([bitwise] exclusive "or"),一种按位运算。本质上是一个加减计算,只是与加减不同。
  • @deviantfan 先生,我真的把你弄糊涂了,对此我深表歉意。
【解决方案2】:

既然你问的是环绕,我在下面回答这个问题。但是从 cmets 可以清楚地看出,您确实尝试了 C++ 表达式 11^5,一个位级 XOR,并得到了答案 14,这与环绕无关。每对位的异或结果如果相同则为0,如果不同则为1。


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

11^5 = 161051。

现在考虑一种情况,其中 16 位用于表示整数,并且只有幅度,没有符号。 IE。 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) 中的任何一个。

【讨论】:

  • 感谢您的关注,先生,但我在 c++ 编译器上运行程序,结果显示为 (b) 14。
  • @Moshin:啊哈。您在 C++ 源代码中使用了表达式 11^5。那不计算幂和环绕。这是一个位级 XOR 操作。
  • 先生,我需要明白这一点,请您传授知识。
  • @MohsinAli 正如旁注一样,结果 14(使用正确的操作)根本不可能,与 int 大小无关。
  • @deviantfan 先生,这怎么可能?
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多