每个人都知道编程语言中的溢出,如果它发生,程序就会崩溃。然而,我不清楚实际上数据是否超出边界。你可以解释一下,说一下C ++或Java的例子。例如,Integer可以保存最多4个字节,如果将数据超过4个字节放到Integer会发生什么。编译器如何识别这种未定义的行为?
答案 0 :(得分:1)
如果将数据超过4个字节放入Integer会发生什么。
通常值将翻转 1 ,这意味着它将从其范围的一端跳到另一端。
即使在Windows计算器中也可以看到这一点。从最高可能的签名 32位值开始:
现在添加一个:
我们溢出有符号Dword的最大值(2 31 -1)。
1 - 这是典型的结果。某些体系结构实际上可能会在整数溢出时生成异常,因此您不应指望此行为。
编译器如何识别这种未定义的行为?
编译器不会识别它。那就是问题所在。 C#可以使用checked
关键字来缓解这个问题,该关键字检查以确保对整数执行的任何算术都不会导致上溢/下溢。