C语言数据溢出问题

#include<stdio.h>
void main()
{ int a, b;
unsigned c,d;
long e,f;
a=100;
b= -100;
e=50000;
f=32767;
c=a;
d=b;
printf(“%d,%d\n”,a,b);
printf(“%u,%u\n”,a,b);
printf(“%u,%u\n”,c,d);
c=a=e;
d=b=f;
printf(“%d,%d\n”,a,b);
printf(“%u,%u\n”,c,d);
}
signed的范围是-32768到32767,那倒数第三行输出50000是怎么加减变成-15536的?

在C语言中,数据的存储就像一个圆圈,正数溢出数据就会从最小负数开始,负数溢出数据同理,打个比方(简略写一下):
int a=32768,b=-32769;
printf("a=%d,b=%d",&a,&b);
则会输出a=-32768,b=32767;
这样则50000输出就是(50000-32767)+(-32768)+(-1)=-15536
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-10-18
一楼的方法可行,用的是高精度整数的方法。
但是但是。。。这题明显考的是数论中的【同余】的知识哦!
计算1000^10 % 1000 ,
1)可以先把 1000 的 10 次方计算出来,再和 1000 求余。很明显,这样【计算的中间结果】会【超出 int 的表示范围】,这样就需要用到【高精度整数】。
2)也可以一边【计算 1000 的 10次方】【一边和1000 求余】,这样的结果和(1)是相同的。
但是很明显,这样【计算的中间结果】【不会超出 int 的表示范围】,最大的【计算的中间结果】一定是【小于余数】的,也就是小于 1000 的,不需要【高精度整数】。

即:
1000^10 % 1000
= 1000 * 1000 * ... * 1000 % 1000 (方法1)
= 1000 % 1000 * 1000 % 1000 * 1000 % 1000 ... *1000 % 1000(方法2)

#include
int main()
{
int a,n,i=1,k,l,m,p;
long j=1;
scanf("%d %d",&a,&n);
while (i<=n)
{
// 方法1
//j*=a;

// 方法2
j=(j*a)%1000;

i++;
}
k=j%1000/100;
l=j%100/10;
m=j%10;
p=k*100+l*10+m;
printf("The last 3 numbers is %d.\n",p);
}
第2个回答  2019-10-17
你是想求阶层。。。20阶层到int型不会溢出呀。。。32位。大的很
第3个回答  2009-05-12
是倒数第三行还是倒数第二行啊!a=-15536吧!你是用tc做还是c++啊!如果是c++的话,那a=50000.如果是Tc的话,那就是-15536.具体是怎么做的,那你就的要找老师或是C语言好的人啊!因为网上不好讲啊!
第4个回答  2009-05-12
老实说没看到你说的-15536.。

对于c语言中的整型数据溢出问题怎么办?
乘法结果的类型也是int,不会发生其他转换。然而,有符号整数运算发生溢出会产生未定义行为,非无符号整数存在此问题。11111 * 11111 = 123454321,值为int类型,而111111 * 111111 = 12345654321,超出了int表示范围,产生未定义行为。同样,111111111 * 111111111也会出现未定义行为。在int为32位的情况下...

C语言程序输出数据溢出问题
在c语言中,数据的存储就像一个圆圈,正数溢出数据就会从最小负数开始,负数溢出数据同理,打个比方(简略写一下):int a=32768,b=-32769;printf("a=%d,b=%d",&a,&b);则会输出a=-32768,b=32767;这样则50000输出就是(50000-32767)+(-32768)+(-1)=-15536 ...

c语言中数据溢出的问题怎么解决?
1、首先,打开C语言编译器,新建一个初始.cpp文件,例如:test.cpp,输入问题基础代码。2、在test.cpp文件中,将int全部调整为long long,printf函数调整为:printf("%lld!=%lld\\n",n,count);。3、编译器运行test.cpp文件,此时成功打印出了大数。

求助c语言 好像是数据溢出
(1)、数组下标越界。这个是 C 语言初学者最容易犯的错误!例如,定义如下数组:int num[10] ; 在 C 语言中其有效的下标范围应该是:0-9,而不是:1-10!如果在源程序中引用了 num[10]变量,那么必定会引起数据溢出现象。但是在PASCAL语言中,其数组有效的下标范围就是:1-10,这就是 C 语...

C语言编程问题,数据溢出。
你的算法有问题:你这个程序的算法没有你想的这么容易,因为实际上中间你是在做幂运算,而幂运算是非常容易溢出的;但是考虑到实际上你只是需要输出后面三位数字即可,那么按照乘法(幂运算其实是乘法运算)的规则,我们知道其实影响最后三位的是两个乘数的后三位,高于后三位的是不参与对乘积的后三位...

C语言中溢出是什么意思
2、溢出可能原因:当应用程序读取用户数据,复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时 (假设定义数组int Array[10], 而在调用时使用Array[11] 或存放的数据超过int类型容量等), 内存缓冲区就可能会溢出.3、溢出因素分析:由于C\/C++语言所固有的缺陷,既不检查数组边界,又不...

c语言中,如果小数点后面的数字溢出,会发生什么情况
A为正数用8位原码表示: 00010101 B为负数用8位补码表示: 10010101(01101011取反加1得到)结果C=A+B=00010101+10010101=10101010 C的高位为1 表示结果为负数,转原码为01010110(减1取反),恢复小数点(小数点左移7位)和符号为-0.101011,运算过程没有发生进位超出8位,因此没有溢出。用十进制...

C语言基本语法知识(十四)数组越界与内存溢出
深入探索C语言:理解数组越界与内存溢出的奥秘 一、数组越界:边界探索与潜在风险\/ C语言中的数组访问,就像一把钥匙,必须对准正确的锁孔。一个定义为n元素的数组,其合法索引范围是0到n-1。例如:int a[5] = {0}; \/\/ 0到4是安全区 尝试访问a[5],就像试图打开已经满员的邮箱,这就陷入了...

C语言关于整型数据溢出的一个问题请教
long 型数据要加附加格式说明符 l 。输出的格式:printf("%ld,%ld",a,b);注意,2个数都是用"%ld"格式输出,否则可能会得到意外的结果。你可以试试用下面的几个语句依次替换printf(“%d,%d”,a,b);1.printf("%d,%ld",a,b);2.printf("%d\\n",a);printf("%d\\n",b);3.printf("%ld\\...

c语言溢出问题
计算机在进行计算时是用补数计算的,且如果溢出会进行丢位处理。如short型32767补码是0111111111111111 加1后为1000000000000000(注意最高位是符号位),1000000000000000正是-32768的补数。而unsigned short型数据无符号65535为1111111111111111(16位),加1后为10000000000000000(17位)这时计算机判断溢出后丢弃第...

相似回答