① 刚学c语言,数据溢出了怎么办
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
11 39916800
12 479001600
13 6227020800
14 87178291200
15 1307674368000
16 20922789888000
17 355687428096000
18 6402373705728000
19 121645100408832000
20 2432902008176640000
21 51090942171709440000
22 1124000727777607680000
23 25852016738884976640000
24 620448401733239439360000
25 15511210043330985984000000
26 403291461126605635584000000
27 10888869450418352160768000000
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
2.71828182846 <type 'float'>
估计C的基本数据类型都会溢出
可以把它看做字符串,模拟加减乘除
或者用其他语言
② c语言算数溢出
四字节指的是你gmol的返回值float,你用两个float相乘结果赋值给double的sum就会触发这个警告,没啥问题可以忽略,或者你也可以将float gmol改为double gmol
③ c语言数据溢出怎么办
C语言的强大之处就在于他的灵活性,程序员自己把握。编译器可以帮助预防错误,但有些程序会利用溢出,所以溢出不完全是错误的事情。
1、溢出:
数据类型超过了计算机字长的界限而出现的数据溢出;
2、溢出可能原因:
当应用程序读取用户数据,复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时 (假设定义数组int Array[10], 而在调用时使用Array[11] 或存放的数据超过int类型容量等), 内存缓冲区就可能会溢出.
3、溢出因素分析:
由于C/C++语言所固有的缺陷,既不检查数组边界,又不检查类型可靠性,且用C/C++语言开发的程序由于目标代码非常接近机器内核,因而能够直接访问内存和寄存器,只要合理编码,C/C++应用程序在执行效率上必然优于其它高级语言。然而,C/C++语言导致内存溢出问题的可能性也要大许多。
④ C语言 高位溢出问题
C语言高位溢出问题跟整形运算总是至少按照整数类型(int)的精度进行的。也就是说,若两个char类型的加法的运算过程可以分解为:先将两个char类型转换为int型,计算结果存储为int型,最后强转为char类型存储。如果两个运算数的精度有一个超过int型。若两个操作数属于不同类型,那么,将运算将两个运算数都转换成高精度类型再参与运算。若两个操作数为相同类型,即使是乘法,还是会按照相同类型计算存储结果。这就是可能会造成溢出现象,需要注意。
⑤ 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语言算术溢出问题怎么解决
首先,这是警告,告诉你有可能产生溢出风险,并不是一定会发生溢出。
其次,底下已经告诉你了,要强制转换一下……
sqrt(i+(long int)100);
⑦ C语言数据溢出问题
100000
*
200000
超出int范围了。
有两种解决方法,
1.long
long
d;
d
=
(long
long)m*n
2.c
=
m
/
最大公约数
*n
;这样先除再乘就不会溢出了
⑧ C语言中char型数据计算后溢出,怎么处理
无符号char
类型能标示的数是:0-255
有符号char类型能标示的数是:-128-127
C中调用积运算符之后做溢出检测已经太晚,但调用和运算符之后做检测则一点也不迟,所以可以通过对和运算结果的检测实现能检测溢出的积运算,因为 a * b 既是a个b的和:-5000000 * 1374389539 等于 -(5000000 * 1374389539)。括号里是 5000000 个 1374389539 的和。
(8)c语言溢出咋办扩展阅读:
在 C 和 C++ 语言本身中,这个问题是不容易解决的。该问题基于 C 语言的根本设计决定(特别是 C 语言中指针和数组的处理方式)。由于 C++ 是最兼容的 C 语言超集,它也具有相同的问题。存在一些能防止这个问题的 C/C++ 兼容版本,但是它们存在极其严重的性能问题。而且一旦改变 C 语言来防止这个问题,它就不再是 C 语言了。许多语言(比如 Java 和 C#)在语法上类似 C,但它们实际上是不同的语言,将现有 C 或 C++ 程序改为使用那些语言是一项艰巨的任务。
⑨ c语言溢出问题
对于正数,反码,补码与原码相同。
对于负数,补码是原码的符号位不变,数值部分按位取反再加1。
short型数据是16位表示最高位是符号位,所以只有15位表示数值,15位000000000000000-111111111111111表示的范围是0-32767,又加上最高位的符号位(第16位),就可以表示-32768-32767 。unsigned short型数据是16位都用来表示数值,16位0000000000000000-1111111111111111表示的范围是0-65535。
计算机在进行计算时是用补数计算的,且如果溢出会进行丢位处理。如short型32767补码是0111111111111111 加1后为1000000000000000(注意最高位是符号位),1000000000000000正是-32768的补数。
而unsigned short型数据无符号65535为1111111111111111(16位),加1后为10000000000000000(17位)这时计算机判断溢出后丢弃第17位,变为0000000000000000就是0了^_^
⑩ 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
吗?