同一个程序在VC和TC下的结果为什么不同呢

来源:百度知道 编辑:UC知道 时间:2024/05/25 01:27:44
就是一摸一样的一个程序在VC和TC下的结果却不同
这是为什么??
#include<stdio.h>
#include<math.h>
int getmod(long,long,long);
int main()
{
int a=0;
long b,p,m; /*R = B^P mod M*/
while(1) {
scanf("%ld",&b);
scanf("%ld",&p);
scanf("%ld",&m);
getchar();
a=(getchar());
if(a==EOF) {
printf("%ld\n",getmod(b,p,m));
return 0;
}
else
printf("%ld\n",getmod(b,p,m));
}
}
int getmod(long b,long p,long m)
{
long zhu;
if(p==0)
return 1;
if(p%2==1) {
b=b%m;
zhu=getmod(b,p/2,m)%m;
return (((zhu*zhu)%m)*b)%m;
}
else {
b=b%m;
zhu=getmod(b,p/2,m)%m;
return (zhu*zhu)%m;
}
}

TC和VC有着本质的区别:
1:一个是16的DOS程序,一个是标准的32的Windows应用程序.前者依然受着64KB内存分段约束,后者无忧无虑地使用着4GB内存地址空间.它们本来就是运行在不同的操作系统上的.别把他们混淆.
DOS程序可以运行在windows上是因为有NTVDM.而你把VC生成的控制台程序放到DOS下只会得到!?This program cannot be run in DOS mode.
2:如果你是用标准库编写的话,代码应该没多大差异的.但执行时调用库方式却差天共地.前者通过API模拟出一个执行环境,后者是直接调用WIN32 API的.
3:TC里面编写程序确实是可以调用中断,可是这个中断不是直接执行的.是NTVDM提供的.在NT的世界里.ring3不太可能直接调用中断的.
4:VC6(早期版本就不知道了)不能编写DOS程序,只能编写控制台程序,注意,这只不过是Win32程序只使用控制台这个标准输入输出而已.控制台程序照样可以弹出个窗口,也可以有消息循环,窗口程序照样可以有个控制台.

所以你的程序不一样,是因为16位和32位的机器字长造成的精确度影响。