【发布时间】:2011-07-07 09:01:26
【问题描述】:
我有一段不确定的作业代码。我有信心知道答案,但我只想与社区再次核对,以防有什么我忘记了。标题基本上是安全编码,问题只是为了解释结果。
int main() {
unsigned int i = 1;
unsigned int c = 1;
while (i > 0) {
i = i*2;
c++;
}
printf("%d\n", c);
return 0;
}
我的理由是这样的:
乍一看,您可以想象代码将永远运行,因为它已初始化为正值并不断增加。这当然是错误的,因为最终值会变得如此之大,以至于会导致整数溢出。这反过来也不完全正确,因为最终它将通过使最后一位为 1 来强制对变量“i”进行签名,因此将其视为负数,从而终止循环。所以它不是写入未分配的内存并因此导致整数溢出,而是违反数据类型并因此导致循环终止。
我很确定这是原因,但我只是想仔细检查一下。有意见吗?
【问题讨论】:
-
不完全——
unsigned int永远不能接受有符号值。您可能会发现尝试编译和运行代码很有启发性:codepad.org/VUjjtvbJ
标签: c loops types integer-overflow