C 4字节整数值溢出

C 4字节整数值溢出,c,memory,int,overflow,C,Memory,Int,Overflow,我和我的朋友在不同的计算机上执行了以下操作: 但两台计算机的结果是一样的。当变量溢出时,内存不应该给出一个随机位置的地址吗?处理器的一个常见行为是整数乘法指令返回数学乘积的低位。例如,当将32位数字乘以32位数字时,完整的数学乘积可以用64位表示,并根据操作数是有符号类型还是无符号类型进行一些调整,但处理器会将该乘积的低32位放入目标寄存器 在您显示的乘积2•4•6•22•24中,数学乘积的低位32位以十六进制表示。当这些位被解释为2的补码时,值为−809500672,因为已设置用于符号的高位

我和我的朋友在不同的计算机上执行了以下操作:


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

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

在您显示的乘积2•4•6•22•24中,数学乘积的低位32位以十六进制表示。当这些位被解释为2的补码时,值为−809500672,因为已设置用于符号的高位


因此,这是您评估的产品中溢出的常见结果。C标准没有定义这种行为,其他结果可能会出现。

否。它只是溢出,并给出结果的最后32位,这将是一个类似随机值的值,没有其不存在的上半部分。溢出与地址无关。因此,当出现溢出时,屏幕上的数字是什么?有符号整数溢出是根据。如C标准中定义的,“未定义的行为”这意味着C标准没有对行为施加任何要求。这并不意味着你无法知道程序执行时会发生什么。这取决于C标准以外的事情。C标准没有规则这一事实并不意味着关于处理器如何工作的规则不适用,也不意味着源代码不适用我知道现在发生了什么。我还有一个问题要问你。在大学里,我们被告知,为了防止溢出,会从屏幕上的内存中打印一个随机值。这是什么真相?我从你写的评论中了解到e这个事件并不简单。谢谢。@thinkblue:如果字面意思是说,这个陈述是错误的;计算机当然不会在溢出时生成随机值。但是有些人使用“随机”这个词不经意间,这意味着一些可能不受控制的值被打印出来。这也不是完全正确的。如答案所示,该值不受C标准的控制,但它受其他因素的影响,如计算机处理器的工作方式。但也有其他因素,如编译器的优化他以意想不到的方式编程,因此结果不一定是−809500672.@thinkblue:那么,首先,答案是“它很复杂。”如果你对事物的工作原理了解得足够多,你可以期待某些行为,但在编译、链接和执行程序的过程中有很多事情需要学习。首先,我感谢你是唯一一个回答我问题的人。我希望有一天我能像你一样成为一名软件开发人员: