帮忙看一个c语言小程序
#include<stdio.h>
int main(void)
{
int i=2;
int n=0;
while(n==0)
{
printf("%d ",i);
i=i*2;
}
return 0;
}
为什么编译运行结果是 不断输出0? 展开
其实题主的程序输出的前 30 个数不是 0。但是因为题主的 while 语句没有停止条件,所以是一个无限循环,导致这部分不为零的结果马上就被一大堆 0 覆盖了。你的程序输出的实际结果为:
这种结果的原因是,题主定义的 i 类型是 int。int 型在 C 语言中默认代表有符号整数(也就是说也可以表示负整数),随编译器以及计算机平台的不同,int 在内存中占用 2 或 4 个字节(byte),因此能表示整数的范围是 [-32767, 32768] 或者 [-2147483648, 2147483647]。题主可以使用
sizeof(int)
来查看自己电脑上 int 占用几个字节。
而这个问题中的 i 是成指数级增长的,也就是说 i 增长的速度非常快,只需循环几次立刻就会超过 int 可以表示的 2147483647 的整数上限。所以你的结果中最后一个正确的值是 1073741824,再乘 2 就是 2147483648,超过了 2147483647,所以变成了负数 -2147483648。这个数再乘以 2,就超出了 4 个字节的二进制数所能表示的所有带符号整数,所以最后变成了 0。因为 0 乘以任何数都是 0,所以后面的数就都是 0 了。
因为计算机是用二进制数以一定的国际标准来表示整数的,而目前计算机还不可能实现无限的存储容量,所以在计算机中能表示的整数大小是有上限的。因此你不可能要求这个程序能无限地运行下去并不断输出正确结果。
目前 C 语言中能输出的最长整数类型是无符号的 long long (unsigned long long) 型,它可以表示 [0, 18446744073709551615] 范围的整数。所以你可以将程序改写成如下来输出尽可能多的结果。
#include <stdio.h>
int main() {
unsigned long long i = 2;
// 这里不用再另创建一个变量 n,使用 1 即可
while (1) {
i = i * 2;
printf("%llu\n", j);
// 检测到 i 为零说明超出范围,因此退出循环避免一直输出 0.
if (i == 0)
break;
}
return 0;
}
运行结果:
(第一行的 8 上面还有 2 和 4,因为太长显示不全了)
以上只是一个粗略的介绍,题主感兴趣的话可以详细查一查计算机领域是如何使用二进制来表示带符号和不带符号的整数和小数的。