帮忙看一个c语言小程序

一个题目说写一个程序,持续打印2的整数倍(2,4,8,16,32......)看看有什么结果,我就写了这个#include<stdio.h>intmain(void){i... 一个题目说写一个程序,持续打印2的整数倍(2,4,8,16,32......)看看有什么结果,我就写了这个
#include<stdio.h>
int main(void)
{
int i=2;
int n=0;
while(n==0)
{
printf("%d ",i);
i=i*2;
}
return 0;
}
为什么编译运行结果是 不断输出0?
展开
 我来答
第一碗羊杂割
推荐于2016-08-02 · TA获得超过6145个赞
知道大有可为答主
回答量:1107
采纳率:80%
帮助的人:564万
展开全部

其实题主的程序输出的前 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,因为太长显示不全了)


以上只是一个粗略的介绍,题主感兴趣的话可以详细查一查计算机领域是如何使用二进制来表示带符号和不带符号的整数和小数的。

帐号已注销
2015-09-17 · TA获得超过463个赞
知道小有建树答主
回答量:598
采纳率:65%
帮助的人:281万
展开全部
别人就是要让你明白,计算机基本数据类型表示的数是很有限的,你可以试一下连19!这样的数,其实是无法表示的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式