求助,菜鸟求助2题!请各位指导

slyer 2004-03-30 06:32:57
1.
main()
{
int a,b,c;
long n;
a=19;
b=22;
c=650;
n=a*b*c;
printf("%ld\n",n);
}
为什么输出的是9556呢?
如果n=19*22*650
输出的也是9556。
另外,如果把c定义为long c;
则输出的是271700,也就是正确的结果,why?

2.
#include <stdlib.h>
main()
{
char *p,*q;
p=(char *)malloc(sizeof(char)*20);
q=p;
scanf("%s%s",p,q);
printf("%s%s\n",p,q);
}

如果输入字符是ab cd
输出的是cdcd
为什么不是abab呢?
感觉应该是输出两个相同的p值啊?
...全文
44 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qbql 2004-03-31
  • 打赏
  • 举报
回复
ok
zhangfjj 2004-03-30
  • 打赏
  • 举报
回复
19*22*650=271700即二进制的100 0010 0101 0101 0100
a*b*c的积用一个中间变量(int)存储,只能存储右16位,即0010 0101 0101 0100
不就是9556吗?
这种错误叫运行错误,在运行过程中出现了溢出。
slyer 2004-03-30
  • 打赏
  • 举报
回复
但是在第一题里面,9556是怎么来的呢???
zhangfjj 2004-03-30
  • 打赏
  • 举报
回复
junnyfeng(听风) 的是正解
zhangfjj 2004-03-30
  • 打赏
  • 举报
回复
VC可以通过~
-----------
是因为VC是32位编译器,int为32位,而TC是16位的编译器,int为16位。
5element 2004-03-30
  • 打赏
  • 举报
回复
VC可以通过~
langjifengyu 2004-03-30
  • 打赏
  • 举报
回复
计算机能用整形打印那么大的数吗
无符号型的才65536了
是不是实数啊
双进度
junnyfeng 2004-03-30
  • 打赏
  • 举报
回复
1。你一定是用TC编译的,int为16位,long为32位
a*b*c 这样的结果会用一个临时变量来放,这个临时变量是根据这几个数中最大类型的那 个变量来定义,这里最大是int了,但结果却是16位的int不能装载的,所以就截取了相应部分,刚好是9556,然后再赋给n
如果c定义为long,那临时变量就是long型了,可以放正确结果

2。p,q都是指向同一个内存地址,p接收了ab,本来打印也是ab,但是后面还输入了cd
这个cd放到q那里,而q与p是一样的,所以原先的ab被覆盖成cd了

languagec 2004-03-30
  • 打赏
  • 举报
回复
第一个没看清题目
languagec 2004-03-30
  • 打赏
  • 举报
回复
1. printf("%ld\n",n); //因为是%Ld而不是 %1d
2. 空格为两个字符串的分隔符,p先为ab,在q 为cd 所以指针指向cd 所以输出cdcd

littleeagle007 2004-03-30
  • 打赏
  • 举报
回复
只跟P 分配内存 没有跟Q分配内存 所以……

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧