C语言关于整型数据溢出的一个问题请教

我是一名C语言的初学者,最近在谭浩强先生的《C语言程序设计》中看到有一道关于整型数据溢出的例题(如下),
#include <stdio.h>
main()
{ int a,b;
a=32767;
b=a+1;
printf(“%d,%d”,a,b);

这道题的运行结果为“32767,-32768”,现在我想得到b=32768的结果,根据书中的提示,将变量b改成long型可以得到预期的结果32768。我写的程序如下:
#include <stdio.h>
main()
{ long a,b;
a=32767;
b=a+1;
printf(“%d,%d”,a,b);
}
我在Turbo C上运行这个程序,得到的结果是“32767,0”,现在我不知道错误在哪里,恳请各位大侠不吝赐教,小月亮不胜感激!
非常感谢大家,我的问题才一天就有这么多人来为我解答。我通过将各位大侠的答案一一在turbo c2.0上运行。运行了如下的程序
#include <stdio.h>
main()
{ long a,b;
a=32767;
b=a+1;
printf("%ld,%ld",a,b); /*当然zjzl1001的写法也可以*/
}
输出的结果是“32767,32768”。部分回答者说在自己的机上运行能得到预期的结果,这可能是编译器的问题。所以shijp、WXD11011,zjzl11001的答案都是符合我的问题要求的,不过悬赏分只能给一个人,那就是第一个回答正确的,不好意思^-^总之小月亮非常谢谢大家帮我解决这个疑惑,以后有什么问题我会再来请教大家的!谢谢大家热情的帮助!

第1个回答  2007-09-19
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\n",a);
printf("%ld\n",b);
你会发现2,3的输出结果是一样的,而1的输出结果却不是预期的。
第2个回答  2007-09-19
应该不会的,除非你的编译器的long型变量只有2个字节,我这里运行的结果是32767,32768,不是0。long至少有4个字节,32768怎么会溢出呢
第3个回答  2007-09-19
main()
{ long a,b;
a=32767;
b=a+1;
printf(“%f,%f”,a,b);
}
第4个回答  2007-09-19
printf(“%d,%d”,a,b);

改为:

printf(“%d,%ld”,a,b);
第5个回答  2007-09-19
应该不会吧
printf(“%ld,%ld”,a,b); 试试?本回答被提问者采纳

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语言中的整型数据溢出问题怎么办?
讨论的前提是int为32位,表示最大数为2147483647,足以表示11111、111111和111111111(5个、6个、9个1)。这三个常量的类型都是int。乘法结果的类型也是int,不会发生其他转换。然而,有符号整数运算发生溢出会产生未定义行为,非无符号整数存在此问题。11111 * 11111 = 123454321,值为int类型,而111111...

关于c语言整型数据的溢出问题~~求高手多指点~~
100000000000000 求补=1 11111111111111+1=00..00 b就溢出为0了。不过现在都是32位系统了,int类型都是4个字节的都,a表示成00..00100000000000000了。楼主的的这个程序不能造成溢出。所以printf ("%d",b);打印出来的b应该是32768,也不是 -32768 ...

(c语言)整型数据的溢出
其实这个问题很简单的,这个可能和你编译器环境有关,int 类型表示范围是-32768-32767。所以你可以把它的表示范围比作一个圆。因为在电脑中负数是按补码保存的,所以加1之后会出现进位。如果是char 类型表示-128-127的话,那么char a = 128也会变成-128的。你可以看一下下面的图,这个圆就好比表示的...

在C语言中,何为整型数的溢出?位操作符和移位操作符又是什么?
位操作符就是对该数据的二进制形式下的每一位分别进行操作使用的操作符就叫位操作符(组织语言能力差了点。。。举个例子吧~~)首先还是刚刚的数据1111B(也就是15,B是什么知道吧...)如果和1010B(也就是10)与运算(与或非知道吧。。。&& || !)那么结果应该是个Bool的值为true(非0即真,两...

C语言中的int整型溢出是怎么回事?
从C语言的内部处理机制来说,int型数超出范围(溢出)被认为是一个正常现象,只会产生错误的计算结果或逻辑错误,而不会触发数据溢出的异常。因此,为了避免因为整数溢出而产生程序逻辑或计算错误,程序员必须自行检测可能出现的溢出或者确保不会出现数据溢出的情况。C语言对于int类型数据超出范围的处理,只有一...

c语言中,整型数据的溢出中为什么32767+1=-367678 请给出详细过程 如果...
c语言中,整型数据的溢出中为什么32767+1=-367678请给出详细过程如果32767+2又是什么结果呢写错了是36767+1的运算结果为-36768... c语言中,整型数据的溢出中为什么32767+1=-367678 请给出详细过程 如果32767+2又是什么结果呢写错了 是36767+1的运算结果为-36768 展开  我来答 2...

C语言整型溢出会怎样
C语言的整型溢出,分为无符号整型溢出和有符号整型溢出。对于unsigned整型溢出,C的规范是有定义的——“溢出后的数会以2^(8*sizeof(type))作模运算”,也就是说,如果一个unsigned char(1字符,8bits)溢出了,会把溢出的值与256求模。

c语言溢出问题,求解答。请详细解释。
但对于a+1和b+1来说,编译器会自动把a,b都提升成长整型来进行计算,长整型是32位,32768在其范围内,不会溢出。所以a+1=32768是正确的。而b的值在定义时就已经是10000000 00000000,被提升为长整型时,因为最高位符号位是1,所以补为长整数时,左边补了16个1,变成11111111 11111111 10000000 ...

c语言数据溢出怎么办
1、溢出:数据类型超过了计算机字长的界限而出现的数据溢出;2、溢出可能原因:当应用程序读取用户数据,复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时 (假设定义数组int Array[10], 而在调用时使用Array[11] 或存放的数据超过int类型容量等), 内存缓冲区就可能会溢出.3、溢出因素...

相似回答