|
发表于 2022-10-12 17:13:36
|
显示全部楼层
回帖奖励 +2 鱼币
本帖最后由 jackz007 于 2022-10-12 19:41 编辑
哪串代码没看懂,关于 overflow?
看看什么才叫真正的溢出检测:
- #include <stdio.h>
- #define maxv 0x7fffffffffffffffLL
- #define minv 0x8000000000000000LL
- int overflow(long long d , char x)
- {
- long long mv ;
- int r = 0 ;
- if(d) {
- mv = (d > 0) ? maxv : minv ;
- if(mv / d >= 10) {
- if(d > 0) {
- if(mv - d * 10 < x) r = 1 ;
- else r = 0 ;
- } else {
- if(mv - d * 10 > x) r = 1 ;
- else r = 0 ;
- }
- } else {
- r = 1 ;
- }
- }
- return r ;
- }
- int main(void)
- {
- char ch ;
- long long num ;
- int c , s ;
- printf("maxv = %I64d\n" , maxv) ;
- printf("minv = %I64d\n" , minv) ;
- for(num = c = 0 , s = 1 ; (ch = getchar()) != '\n' ;) {
- if(ch >= '0' && ch <= '9') {
- ch -= '0' ;
- if(num < 0) ch = -ch ;
- if(! overflow(num , ch)) {
- num = num * 10 + ch ;
- } else {
- num = -1 ;
- break ;
- }
- if(num && s < 0) num = -num ;
- c ++ ;
- } else {
- if(s < 0) s = -s ;
- if(! c) {
- if(ch == '-') s = - s ;
- } else {
- break ;
- }
- }
- }
- printf("%I64d\n" , num) ;
- }
复制代码
编译、运行实况:
- D:\[00.Exerciese.2022]\C>g++ -o x x.c
- D:\[00.Exerciese.2022]\C>x
- maxv = 9223372036854775807
- minv = -9223372036854775808
- 9223372036854775807
- 9223372036854775807
- D:\[00.Exerciese.2022]\C>x
- maxv = 9223372036854775807
- minv = -9223372036854775808
- -9223372036854775808
- -9223372036854775808
- D:\[00.Exerciese.2022]\C>x
- maxv = 9223372036854775807
- minv = -9223372036854775808
- 9223372036854775808
- -1
- D:\[00.Exerciese.2022]\C>x
- maxv = 9223372036854775807
- minv = -9223372036854775808
- -9223372036854775809
- -1
- D:\[00.Exerciese.2022]\C>
复制代码
后两次打印 -1 就是因为溢出 |
|