main()
{
long a,b;
a=32767;
b=a+1;
printf("%ld\n%ld",a,b);
}
输出结果:
35676
35678
正常
替换为:printf("%d\n%ld",a,b);
输出结果:
32767
-2147483648
第二个数据明显溢出了,表示上是符合的
继续替换:
printf("%d\n%ld\n%d",a,b);
输出结果:
32767
-2147483648
0
再换:printf("%d\n%ld\n%ld",a,b);
输出结果:
32767
-2147483648
2147418112
以上结果希望从printf取数据打印规则和数据储存的角度加以解释,谢谢
yyrryyrr2 你的说明很详细 还有一处没理解
a,b均为long 第二次取%ld数据时候 b应有补码 为何取了main的局部变量
对于c语言中的整型数据溢出问题怎么办?
讨论的前提是int为32位,表示最大数为2147483647,足以表示11111、111111和111111111(5个、6个、9个1)。这三个常量的类型都是int。乘法结果的类型也是int,不会发生其他转换。然而,有符号整数运算发生溢出会产生未定义行为,非无符号整数存在此问题。11111 * 11111 = 123454321,值为int类型,而111111...
关于c语言整型数据的溢出问题~~求高手多指点~~
对于整数,反码,补码与原码相同。对于负数,补码是原码的符号位不变,数值部分按位取反再加1。知道负数补码,可以对改补码再一次求补码,就可以得到原码。假设你是16位系统。100000000000000 求补=1 11111111111111+1=00..00 b就溢出为0了。不过现在都是32位系统了,int类型都是4个字节的都,a表示...
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整型溢出是怎么回事?
从C语言的内部处理机制来说,int型数超出范围(溢出)被认为是一个正常现象,只会产生错误的计算结果或逻辑错误,而不会触发数据溢出的异常。因此,为了避免因为整数溢出而产生程序逻辑或计算错误,程序员必须自行检测可能出现的溢出或者确保不会出现数据溢出的情况。C语言对于int类型数据超出范围的处理,只有一...
(c语言)整型数据的溢出
其实这个问题很简单的,这个可能和你编译器环境有关,int 类型表示范围是-32768-32767。所以你可以把它的表示范围比作一个圆。因为在电脑中负数是按补码保存的,所以加1之后会出现进位。如果是char 类型表示-128-127的话,那么char a = 128也会变成-128的。你可以看一下下面的图,这个圆就好比表示的...
C语言整型溢出会怎样
C语言的整型溢出,分为无符号整型溢出和有符号整型溢出。对于unsigned整型溢出,C的规范是有定义的——“溢出后的数会以2^(8*sizeof(type))作模运算”,也就是说,如果一个unsigned char(1字符,8bits)溢出了,会把溢出的值与256求模。
在C语言中,何为整型数的溢出?位操作符和移位操作符又是什么?
对于溢出上面的回答就行,补充一些,根据不同的机器(不同位宽)占的位宽也是不同的。不一定都是32。另外关于溢出:假如现在我的空间只有4位2进制(以下补码和符号不考虑,工作起来都一样)也就是我只能表示0000到1111(也就是0-15)的数据 如果我现在已经存了1111这么样一个数据,可是系统又要给它+...
C语言什么时候整型数据溢出会变成0?
整形就是int型,上溢就是从最大正数变成最大负数 但是如果是unsigned的时候,最大值上溢就变成0了。
C语言数据溢出时的值是负值吗
数据溢出分为上溢出和下溢出两种情况。另外数据存储在变量里时与变量的数据类型密切相关。所以溢出现象要分类讨论。例如,unsigned int型或unsigned short型或unsigned char型变量在上溢出时,将舍去超范围数据,其值仍然为正。附上测试程序:include <stdio.h> void main(void){ unsigned char j=255;j...
c语言溢出问题,求解答。请详细解释。
但对于a+1和b+1来说,编译器会自动把a,b都提升成长整型来进行计算,长整型是32位,32768在其范围内,不会溢出。所以a+1=32768是正确的。而b的值在定义时就已经是10000000 00000000,被提升为长整型时,因为最高位符号位是1,所以补为长整数时,左边补了16个1,变成11111111 11111111 10000000 ...