Kai*_*aan 5 c types loops integer-overflow
我有一段我不确定的作业代码.我有信心我知道答案,但我只是想与社区仔细检查,因为我忘记了一些事情.标题基本上是安全编码,问题只是解释结果.
int main() {
unsigned int i = 1;
unsigned int c = 1;
while (i > 0) {
i = i*2;
c++;
}
printf("%d\n", c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的理由是这样的:
乍一看,你可以想象代码将永远运行,考虑到它被初始化为正值并且不断增加.这当然是错误的,因为最终这个值会变得如此之大,会导致整数溢出.这反过来也不完全正确,因为最终它会强制变量'i'通过将最后一位设为1来进行签名,因此被视为负数,因此终止循环.因此,它不会写入未分配的内存,因此会导致整数溢出,而是会违反数据类型,从而导致循环终止.
我很确定这是原因,但我只想仔细检查.任何意见?
不,unsigned int永远不会将零作为有符号数进行比较.循环结束的唯一机会是变量准确为零.
后者肯定会发生一次,因为你在每次迭代中乘以2(偶数),这会导致从右边(最不重要的位)插入一个零位,所以在经过一定次数的迭代后,所有非零位都将是"从数字中移出"它将变为零.