一个关于数据类型的问题

sjt000 2006-10-29 08:01:57
最近在看谭老的书,在做一练习题时遇到一问题:
一个5位数,要求输出他的每一位数字.
比如:56789 要求输出5,6,7,8,9.
我写的程序是:
#include<stdio.h>
void main()
{
long int num=56789;
int indiv,ten,hundred,thousand,ten_thousand;/*分别代表个位,十位,百位,千位,万位*/
ten_thousand=num/10000;
thousand=(num-ten_thousand*10000)/1000;
hundred=(num-ten_thousand*10000-thousand*1000)/100;
ten=(num-ten_thousand*10000-thousand*1000-hundred*100)/10;
indiv=num-ten_thousand*10000-thousand*1000-hundred*100-ten*10;
printf("每一位数字分别是:%d,%d,%d,%d,%d.\n",ten_thousand,thousand,hundred,ten,indiv);
}
我发现这个程序在num在40000以上的时候这个程序就出现错误了,我看了答案里面是对
thousand=(int)(num-ten_thousand*10000)/1000;
后面的几个式子里都加上了(int)强制转换成了整形
我认为不转换应该也不影响结果的,本身ten-thousand,thousand,等都是int型,式子里是long int然后结果赋给他们,截取int部分的结果则么会错呢?
望各位给出详细解释,换算出错的过程,小弟很是困惑.
...全文
438 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
louisming 2006-10-30
  • 打赏
  • 举报
回复
悄悄建议一下,LZ解决这种东西最好弄个栈
或者找个数组存一下再输出
sjt000 2006-10-30
  • 打赏
  • 举报
回复
我使用的是16位int的环境TC++3.0
kookworm说的我现在也考虑到了,不过他的原程序是这样的:
#include<stdio.h>
void main()
{
long int num=56789;
int indiv,ten,hundred,thousand,ten_thousand;/*分别代表个位,十位,百位,千位,万位*/
ten_thousand=num/10000;
thousand=(int)(num-ten_thousand*10000)/1000;
hundred=(int)(num-ten_thousand*10000-thousand*1000)/100;
ten=(int)(num-ten_thousand*10000-thousand*1000-hundred*100)/10;
indiv=(int)(num-ten_thousand*10000-thousand*1000-hundred*100-ten*10);
printf("每一位数字分别是:%d,%d,%d,%d,%d.\n",ten_thousand,thousand,hundred,ten,indiv);
}
这样的话ten_thousand*10000的溢出问题仍然没有解决,但答案正确
不知道何解?
apricot0819 2006-10-30
  • 打赏
  • 举报
回复
老谭就教人写这笨的程序!!!!
wsm842685 2006-10-30
  • 打赏
  • 举报
回复
这类的程序最好不要设整型的类型,用字符串来操作比较容易控制,而且不易出错,你可以去试试!
kookworm 2006-10-30
  • 打赏
  • 举报
回复
发表意见时,要看清楚运行环境,如果int是32位的,那就不可能出问题了,整个程序就是正确的了,只有在16位的int中,才可能出上述问题,可修改为:
#include<stdio.h>
void main()
{
long int num=56789;
int indiv,ten,hundred,thousand,ten_thousand;/*分别代表个位,十位,百位,千位,万位*/

ten_thousand=num/10000;
thousand=num/1000 - -ten_thousand*10;
hundred=num/100-ten_thousand*100-thousand*10;
ten=num/10-ten_thousand*1000-thousand*100-hundred*10;
indiv=num%10;
printf("每位数字是:%d,%d,%d,% d,%.\n",ten_thousand,thousand,hundred,ten,indiv);
}
kookworm 2006-10-30
  • 打赏
  • 举报
回复
这个问题是这样的,长整形在TC3.0下是32位的,若用16进制表示则为: XXXXEEEE
其中每个X或E表示一个16进制位,也即4个2进制位,当两个整形数运算时,如果超出其表示范围,系统自动转换,即取低16位,这样设ten_thousand*10000的正确结果为XXXXEEEE,那么系统自动取出EEEE作为运算结果,这样用num-ten_thousand*10000时实际执行的为:
XXXXEEEE - EEEE,结果是低的16位与执行XXXXEEEE - XXXXEEEE是一样的,只是高16位不同,而对XXXXEEEE - EEEE的结果执行强制转换(int)后,系统只取低16位,那结果自然就正确了。

老谭的书写出这样的答案,也真难为大家了,可能连老谭自己都不知道原因是什么,只是结果碰巧对了而已,太害人了。所以我认为以前的是正解,而老谭的程序就作为一个谈资算了,要不能怎样,谁让人家是名人呢,害人呀。
boliang319 2006-10-29
  • 打赏
  • 举报
回复
建议搂住学习C语言别用TC,太老了。
lccwin32不错,一个开源的windows下面的编译器,int是4字节的.
关键是这个编译器很小,具有命令行界面与集成开发环境。
缺点是集成开发环境对中文支持不好。
boliang319 2006-10-29
  • 打赏
  • 举报
回复
kunder()说的对, tc 的int是2字节的,能表示的最大整数只有32768,你应该把
int indiv,ten,hundred,thousand,ten_thousand
定义中的int 也改成long int
最后输出的时候用%ld输出就行了。
飞哥 2006-10-29
  • 打赏
  • 举报
回复
程序看起来好乱啊~
kunder 2006-10-29
  • 打赏
  • 举报
回复
楼上的,int型是4个字节吧?或许tc30认为是2个字节?16位机?
kookworm 2006-10-29
  • 打赏
  • 举报
回复
#include<stdio.h>
void main()
{
long int num=56789;
int indiv,ten,hundred,thousand,ten_thousand;/*分别代表个位,十位,百位,千位,万位*/
ten_thousand=num/10000;
thousand=(num-ten_thousand*10000)/1000;
hundred=(num-ten_thousand*10000-thousand*1000)/100;
ten=(num-ten_thousand*10000-thousand*1000-hundred*100)/10;
indiv=num-ten_thousand*10000-thousand*1000-hundred*100-ten*10;
printf("每一位数字分别是:%d,%d,%d,%d,%d.\n",ten_thousand,thousand,hundred,ten,indiv);
}
这个程序当然有问题了,是你对运算规则了解不透,因为ten_thousand=5,那么
5*10000=50000超出了整形数的表示范围-32768--+32767,所以50000成了-15536,那么
num-ten_thousand*10000就成了56789+15536=72325,这样除以1000后的商为72,其它
几个可以一样分析出结果的。

另外你说强制转换成整形,也不会对的呀,应强制转换为长整形吧,能不能把老谭的答案贴
出来看一下。
我啃 2006-10-29
  • 打赏
  • 举报
回复
整数运算是运算后无视所有小数数据,所以可以得到正确的答案,可能TC3会四舍五入吧,所以错了
我啃 2006-10-29
  • 打赏
  • 举报
回复
……哦用VC没有问题,大概是编译器整数处理有问题吧,建议逐步跟踪,看哪里出问题,
手头没有TC++3没有办法调试
sjt000 2006-10-29
  • 打赏
  • 举报
回复
我用TC++3.0编译的
我只是把有问题的部分自己弄了出来
我啃 2006-10-29
  • 打赏
  • 举报
回复
谭老=老谭的书就是误人啊
都写出这种程序了……
我啃 2006-10-29
  • 打赏
  • 举报
回复
没有问题啊,你是什么编译器?
理论上说,整型的强制转换是没有危险可言的(或者说是很小的)
只有混合运算的时候比较麻烦

70,037

社区成员

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

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