【问题标题】:4 Byte int Value Overflow4 字节 int 值溢出
【发布时间】:2020-03-25 10:02:59
【问题描述】:

我和我的朋友在不同的计算机上做了以下事情:

但是两台电脑的结果是一样的。变量溢出时内存不应该给出随机位置的地址吗?

【问题讨论】:

  • 没有。它只是溢出并给出结果的最后 32 位,这将是一些随机值,没有其不存在的上部。
  • 溢出与地址无关。
  • 那么溢出时屏幕上的数字是多少?
  • 签名int溢出是undefined behavior per the C standard
  • C 标准中定义的“未定义行为”是指C 标准对行为没有任何要求。这并不意味着您无法知道程序执行时会发生什么。这取决于C标准以外的东西。 C 标准没有规则这一事实并不意味着有关处理器工作方式的规则不适用,也不意味着编译器本身的源代码行为不端或限制行为的其他因素或规则不适用。跨度>

标签: c memory int overflow


【解决方案1】:

处理器的一个常见行为是整数乘法指​​令返回数学乘积的低位。例如,当一个 32 位数字乘以一个 32 位数字时,完整的数学乘积可以用 64 位表示(根据操作数是有符号还是无符号类型进行一些调整),但处理器会将低目标寄存器中该乘积的 32 位。

在您展示的乘积中,2 • 4 • 6 • ... • 22 • 24,数学乘积的低 32 位是 cfc00000(以十六进制表示)。当这些位被解释为二进制补码时,该值为 -809500672,因为设置了高位(用于符号)。

所以这是您评估的产品中溢出的常见结果。此行为未由 C 标准定义,可能会出现其他结果。

【讨论】:

  • 我明白现在发生了什么。我还有一个问题要问你。在大学里,我们被告知会在屏幕上从内存中打印一个随机值,以防溢出。真相是什么?我从你上面写的评论中了解到,这个事件并不简单。谢谢。
  • @thinkblue:如果按字面意思表示,则该陈述是错误的;计算机当然不会在溢出的情况下生成 random 值。但是有些人粗心地使用“随机”这个词,而不是意味着打印了一些可能不受控制的值。这也不完全正确。如this answer所示,该值不受C标准控制,但受其他因素影响,例如计算机处理器的工作方式。但也有其他因素,例如编译器以意想不到的方式转换程序的优化,因此结果不一定是 -809500672。
  • @thinkblue:首先,答案是“这很复杂”。如果您对事物的运作方式有足够的了解,则可以预期某些行为,并带有各种警告。但是对于编译、链接和执行程序所涉及的许多事情,还有很多东西需要学习。
  • 首先,我很感谢您是唯一回答我问题的人。我希望有一天我能像你一样成为一名软件开发人员:)
猜你喜欢
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
相关资源
最近更新 更多