① 关于c语言溢出的问题,有代码
你这个程序的输出结果就是溢出的输出结果阿。。
数据类型规定相应的取值范围,例如int 用2个字节16位表示,一个位作符号位,剩下15位能表示2的15次方=32768位,于是无符号位的int最多能表示
-32768~32767,也说是说你定义的变量类型是int,但它的数不在这个表示范围就称为溢出。以此类推其他类型。
有个初学者的群,有兴趣可加入63223976
② c语言中溢出如何处理
C 中调用积运算符之后做溢出检测已经太晚,但调用和运算符之后做检测则一点也不迟,
所以你可以通过对和运算结果的检测实现能检测溢出的积运算,因为 a * b 既是 a 个 b 的和:
-5000000 * 1374389539 等于 -(5000000 * 1374389539)。括号里是 5000000 个 1374389539 的和。
我把能检测溢出的和运算包在 add( ) 里,然后在 multiply( ) 里重复调用 add( )。
add( ) 怎么检测溢出?
和运算的结果若溢出将导致数值的环绕。上溢导致往下环绕,下溢导致往上环绕。
边界状况:
(1)最轻微的上溢是 INT_MAX + 1 :结果是 INT_MIN。
(2)最严重的上溢是 INT_MAX + INT_MAX :结果是 -2。
(3)最轻微的下溢是 INT_MIN - 1 :结果是 INT_MAX。
(4)最严重的下溢是 INT_MIN - INT_MIN :结果是 0。
结论:
(1)所有上溢结果都小于任何一个操作数。
(2)所有下溢结果都大于任何一个操作数。
所以 add( ) 可以用结果和任意选定的一个参数判断溢出,并以落选的参数判断溢出的方向。
add( ) 无法以返回值举报溢出,所以采用 strtol( ) 的举报方法。
不同于 strtol( ) 的是,若没有溢出,add( ) 会把 0 赋值给 errno。
multiply( ) 在这方面跟 add( ) 一样。
当然,应付溢出的最佳方法还是防范:充分了解数据的范围,选择恰当的变量类型。
③ C语言中怎么处理溢出
C 中调用积运算符之后做溢出检测已经太晚,但调用和运算符之后做检测则一点也不迟,
所以你可以通过对和运算结果的检测实现能检测溢出的积运算,因为 a * b 既是 a 个 b 的和:
-5000000 * 1374389539 等于 -(5000000 * 1374389539)。括号里是 5000000 个 1374389539 的和。
我把能检测溢出的和运算包在 add( ) 里,然后在 multiply( ) 里重复调用 add( )。
add( ) 怎么检测溢出?
和运算的结果若溢出将导致数值的环绕。上溢导致往下环绕,下溢导致往上环绕。
边界状况:
(1)最轻微的上溢是 INT_MAX + 1 :结果是 INT_MIN。
(2)最严重的上溢是 INT_MAX + INT_MAX :结果是 -2。
(3)最轻微的下溢是 INT_MIN - 1 :结果是 INT_MAX。
(4)最严重的下溢是 INT_MIN - INT_MIN :结果是 0。
结论:
(1)所有上溢结果都小于任何一个操作数。
(2)所有下溢结果都大于任何一个操作数。
所以 add( ) 可以用结果和任意选定的一个参数判断溢出,并以落选的参数判断溢出的方向。
add( ) 无法以返回值举报溢出,所以采用 strtol( ) 的举报方法。
不同于 strtol( ) 的是,若没有溢出,add( ) 会把 0 赋值给 errno。
multiply( ) 在这方面跟 add( ) 一样。#include<stdio.h>
#include<errno.h> /* errno, ERANGE */
/*
* Returns the sum of a and b, with overflow and underflow check.
* If overflow or underflow occurred, sets errno to ERANGE, else to 0.
*/
int add( int a, int b ) {
int result = a + b;
if( b > 0 && result > a || b <= 0 && result <= a )
errno = 0;
else
errno = ERANGE;
return result;
}
/*
* Returns the proct of a and b obtained through repeated call of add( ).
* Affects errno exactly as add( ) does.
*/
int multiply( int a, int b ) {
int sign_of_a = 1,
result = 0,
i = 0;
/* Keep the sign of multiplier off the loop sentinel. */
if( a < 0 ) {
sign_of_a = -1;
a *= -1;
}
/* Have to reset errno here because it won't be updated if a is 0. */
errno = 0;
while( i++ < a ) {
result = add( result, b );
if( errno == ERANGE )
break;
}
return result * sign_of_a;
}int main( ) {
int result;
/* Operands too huge: sure overflow. */
result = multiply( -5000000, 1374389539 );
if( errno == ERANGE )
perror( "Uh oh" );
else
printf( "%d\n", result );
/* Small operands: safe. */
result = multiply( 49, -972 );
if( errno == ERANGE )
perror( "Uh oh" );
else
printf( "%d\n", result );
}当然,应付溢出的最佳方法还是防范:充分了解数据的范围,选择恰当的变量类型。
也许你正考虑改用不需要你担心整数类型溢出的语言。考虑过 Python 吗?
④ 急求 c语言整型数据溢出怎么办
按道理10的9次方是在无符号长整形范围内,不应该会溢出的.
⑤ C语言数据溢出
int
型
占4字节(所占字节和编译器有关的,此处所说的是在VC上,比如在TC或BC上占2字节)
有符号
int
范围
-2^31~2^31-1
无符号
int
范围
0~2^32-1
如果超出这个范围就会溢出
⑥ (c语言)整型数据的溢出
其实这个问题很简单的,这个可能和你编译器环境有关,int 类型表示范围是-32768-32767。所以你可以把它的表示范围比作一个圆。因为在电脑中负数是按补码保存的,所以加1之后会出现进位。如果是char 类型表示-128-127的话,那么char a = 128也会变成-128的。
你可以看一下下面的图,这个圆就好比表示的范围。如果不信的话你可以将int a = 32769;试试的,输出应该会变成-32787
⑦ C语言溢出判断
这个是用VC6写的控制台程序中从2147483644开始累加的数列,可以看出溢出的时候没有任何错误提示:
2147483644
2147483645
2147483646
2147483647
-2147483648
-2147483647
-2147483646
-2147483645
-2147483644
-2147483643
-2147483642
这个是我写的可以判断溢出的加法函数:
#include
<stdio.h>
int
uoadd
(int
a,int
b,int
*overflow);
int
overflow;
int
main
()
{
int
a=2147483647-9,b=10,c=0;
c=uoadd(a,b,&overflow);
if
(overflow
==
1)
printf
("溢出!\n");
else
printf
("%d\n",c);
return
(0);
}
int
uoadd
(int
a,int
b,int
*overflow)
{
*overflow=0;
if
(a>0
&&
b>0
&&
a+b<0)
*overflow=1;
if
(a<0
&&
b<0
&&
a+b>0)
*overflow=1;
return
(a+b);
}
VC6编译,新建工程的时候选控制台程序
其实其他的应用程序可能会内置判断溢出的东西,比如VB就会判断,如果数据溢出了就会弹出一个对话框,其他的就不知道了
其实这个东西用汇编解决相当容易了,但考虑到可读性还是用C比较好
⑧ c语言中数据溢出的问题怎么解决
需要准备的材料分别有:电脑、C语言编译器。
1、首先,打开C语言编译器,新建一个初始.cpp文件,例如:test.cpp,输入问题基础代码。
⑨ 一个C语言溢出的问题
首先65536的二进制数是
10000000000000000
17位
你的unsigned
short只有2个字节16位。
所以机器只将65536的低16位赋给a即
a在机器中等于0000000000000000
所以a等于0啦
溢出应该相当于将一个大格式的数赋给小格式的数。
都是因为分配内存的固定的缘故,你只要记着机器赋值的时候,只给低位
高位的溢出就行了